⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rulelhs.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
       (connectorValue == NOT_CE))     {      theNode->type = connectorValue;      theNode->right = theGroup;     }   /*=================================================================*/   /* Wrap two not CEs around the patterns contained in an exists CE. */   /*=================================================================*/   else if (connectorValue == EXISTS_CE)     {      theNode->type = NOT_CE;      theNode->right = GetLHSParseNode(theEnv);      theNode->right->type = NOT_CE;      theNode->right->logical = logical;      if (theGroup->bottom != NULL)        {         theNode->right->right = GetLHSParseNode(theEnv);         theNode->right->right->type = AND_CE;         theNode->right->right->logical = logical;         theNode->right->right->right = theGroup;        }      else        { theNode->right->right = theGroup; }     }   /*==================================================*/   /* For a forall CE, wrap a not CE around all of the */   /* CEs and a not CE around the 2nd through nth CEs. */   /*==================================================*/   else if (connectorValue == FORALL_CE)     {      theNode->type = NOT_CE;      tempNode = theGroup->bottom;      theGroup->bottom = NULL;      theNode->right = GetLHSParseNode(theEnv);      theNode->right->type = AND_CE;      theNode->right->logical = logical;      theNode->right->right = theGroup;      theGroup = tempNode;      theNode->right->right->bottom = GetLHSParseNode(theEnv);      theNode->right->right->bottom->type = NOT_CE;      theNode->right->right->bottom->logical = logical;      tempNode = theNode->right->right->bottom;      if (theGroup->bottom == NULL)        { tempNode->right = theGroup; }      else        {         tempNode->right = GetLHSParseNode(theEnv);         tempNode->right->type = AND_CE;         tempNode->right->logical = logical;         tempNode->right->right = theGroup;        }     }   /*================*/   /* Return the CE. */   /*================*/   return(theNode);  }/***********************************************//* GroupPatterns: Groups a series of connected *//*   conditional elements together.            *//***********************************************/static struct lhsParseNode *GroupPatterns(  void *theEnv,  char *readSource,  int terminator,  char *terminatorString,  int *error)  {   struct lhsParseNode *lastNode, *newNode, *theNode;   lastNode = theNode = NULL;   while (TRUE)     {      /*==================*/      /* Get the next CE. */      /*==================*/      newNode = LHSPattern(theEnv,readSource,terminator,terminatorString,                           error,FALSE,NULL,NULL);      /*=======================================================*/      /* If an error occurred, release any LHS data structures */      /* previously allocated by this routine.                 */      /*=======================================================*/      if (*error)        {         ReturnLHSParseNodes(theEnv,theNode);         return(NULL);        }      /*===============================================*/      /* A NULL value for the CE just parsed indicates */      /* that the terminator for the group of patterns */      /* was encountered (either a "=>" or a ")".      */      /*===============================================*/      if (newNode == NULL)        {         PPBackup(theEnv);         PPBackup(theEnv);         if (terminator == RPAREN)           { SavePPBuffer(theEnv,terminatorString); }         else           {            PPCRAndIndent(theEnv);            SavePPBuffer(theEnv,terminatorString);           }         return(theNode);        }      /*============================*/      /* Add the new CE to the list */      /* of CEs being grouped.      */      /*============================*/      if (lastNode == NULL)        { theNode = newNode; }      else        { lastNode->bottom = newNode; }      lastNode = newNode;      /*======================================*/      /* Fix the pretty print representation. */      /*======================================*/      PPCRAndIndent(theEnv);     }  }/**************************************************************//* TestPattern: Handles parsing of test conditional elements. *//*                                                            *//* <test-CE> ::= (test <function-call>)                       *//**************************************************************/static struct lhsParseNode *TestPattern(  void *theEnv,  char *readSource,  int *error)  {   struct lhsParseNode *theNode;   struct token theToken;   struct expr *theExpression;   /*================================================*/   /* Create the data specification for the test CE. */   /*================================================*/   SavePPBuffer(theEnv," ");   theNode = GetLHSParseNode(theEnv);   theNode->type = TEST_CE;   theExpression = Function0Parse(theEnv,readSource);   theNode->expression = ExpressionToLHSParseNodes(theEnv,theExpression);   ReturnExpression(theEnv,theExpression);   if (theNode->expression == NULL)     {      *error = TRUE;      ReturnLHSParseNodes(theEnv,theNode);      return(NULL);     }   /*=========================================================*/   /* Check for the closing right parenthesis of the test CE. */   /*=========================================================*/   GetToken(theEnv,readSource,&theToken);   if (theToken.type != RPAREN)     {      SyntaxErrorMessage(theEnv,"test conditional element");      *error = TRUE;      ReturnLHSParseNodes(theEnv,theNode);      return(NULL);     }   /*=====================*/   /* Return the test CE. */   /*=====================*/   return(theNode);  }/****************************************************************//* AssignmentParse: Finishes the parsing of pattern conditional *//*   elements that have been bound to a  variable.              *//*                                                              *//* <assigned-pattern-CE> ::= ?<variable-symbol> <- <pattern-CE> *//****************************************************************/static struct lhsParseNode *AssignmentParse(  void *theEnv,  char *readSource,  SYMBOL_HN *factAddress,  int *error)  {   struct lhsParseNode *theNode;   struct token theToken;   /*=====================================================*/   /* Patterns cannot be bound if they are with a not CE. */   /*=====================================================*/   if (PatternData(theEnv)->WithinNotCE)     {      PrintErrorID(theEnv,"RULELHS",2,TRUE);      EnvPrintRouter(theEnv,WERROR,"A pattern CE cannot be bound to a pattern-address within a not CE\n");      *error = TRUE;      return(NULL);     }   /*===============================================*/   /* Check for binder token, "<-", after variable. */   /*===============================================*/   SavePPBuffer(theEnv," ");   GetToken(theEnv,readSource,&theToken);   if ((theToken.type == SYMBOL) ? (strcmp(ValueToString(theToken.value),"<-") != 0) :                                   TRUE)     {      SyntaxErrorMessage(theEnv,"binding patterns");      *error = TRUE;      return(NULL);     }   SavePPBuffer(theEnv," ");   /*================================================*/   /* Check for opening left parenthesis of pattern. */   /*================================================*/   GetToken(theEnv,readSource,&theToken);   if (theToken.type != LPAREN)     {      SyntaxErrorMessage(theEnv,"binding patterns");      *error = TRUE;      return(NULL);     }   /*======================================================*/   /* Parse the pattern and return the data specification. */   /*======================================================*/   GetToken(theEnv,readSource,&theToken);   theNode = SimplePatternParse(theEnv,readSource,&theToken,error);   if (*error == TRUE)     {      ReturnLHSParseNodes(theEnv,theNode);      return(NULL);     }   /*=============================================*/   /* Store the name of the variable to which the */   /* pattern is bound and return the pattern.    */   /*=============================================*/   theNode->value = (void *) factAddress;   return(theNode);  }/************************************************************//* TagLHSLogicalNodes: Marks all *and*, *or*, and *not* CEs *//*   contained within a logical CE as having the properties *//*   associated with a logical CE.                          *//************************************************************/static void TagLHSLogicalNodes(  struct lhsParseNode *nodePtr)  {   while (nodePtr != NULL)     {      nodePtr->logical = TRUE;      if ((nodePtr->type == AND_CE) ||          (nodePtr->type == OR_CE) ||          (nodePtr->type == NOT_CE))        { TagLHSLogicalNodes(nodePtr->right); }      nodePtr = nodePtr->bottom;     }  }/***********************************************************//* SimplePatternParse: Parses a simple pattern (an opening *//*   parenthesis followed by one or more fields followed   *//*   by a closing parenthesis).                            *//*                                                         *//* <pattern-CE> ::= <ordered-pattern-CE> |                 *//*                  <template-pattern-CE>                  *//***********************************************************/static struct lhsParseNode *SimplePatternParse(  void *theEnv,  char *readSource,  struct token *theToken,  int *error)  {   struct lhsParseNode *theNode;   struct patternParser *tempParser;   /*=================================================*/   /* The first field of a pattern must be a symbol.  */   /* In addition, the symbols ":" and "=" can not    */   /* be used because they have special significance. */   /*=================================================*/   if (theToken->type != SYMBOL)     {      SyntaxErrorMessage(theEnv,"the first field of a pattern");      *error = TRUE;      return(NULL);     }   else if ((strcmp(ValueToString(theToken->value),"=") == 0) ||            (strcmp(ValueToString(theToken->value),":") == 0))     {      SyntaxErrorMessage(theEnv,"the field field of a pattern");      *error = TRUE;      return(NULL);     }   /*===============================================*/   /* Construct the topmost node of the pattern CE. */   /*===============================================*/   theNode = GetLHSParseNode(theEnv);   theNode->type = PATTERN_CE;   theNode->negated = FALSE;   theNode->exists = FALSE;   /*======================================================*/   /* Search for a pattern parser that claims the pattern. */   /*======================================================*/   for (tempParser = PatternData(theEnv)->ListOfPatternParsers;        tempParser != NULL;        tempParser = tempParser->next)     {      if ((*tempParser->recognizeFunction)((SYMBOL_HN *) theToken->value))        {         theNode->patternType = tempParser;         theNode->right = (*tempParser->parseFunction)(theEnv,readSource,theToken);         if (theNode->right == NULL)           {            *error = TRUE;            ReturnLHSParseNodes(theEnv,theNode);            return(NULL);           }         PropagatePatternType(theNode,tempParser);         return(theNode);        }     }   /*=================================*/   /* If a pattern parser couldn't be */   /* found, then signal an error.    */   /*=================================*/   *error = TRUE;   SyntaxErrorMessage(theEnv,"the field field of a pattern");   ReturnLHSParseNodes(theEnv,theNode);   return(NULL);  }/**************************************************************//* PropagatePatternType: Sets the selfPattern field for all   *//*   lhsParseNodes in a linked list of those data structures. *//**************************************************************/globle void PropagatePatternType(  struct lhsParseNode *theLHS,  struct patternParser *theParser)  {   while (theLHS != NULL)     {      theLHS->patternType = theParser;      if (theLHS->right != NULL) PropagatePatternType(theLHS->right,theParser);      if (theLHS->expression != NULL) PropagatePatternType(theLHS->expression,theParser);      theLHS = theLHS->bottom;     }  }#endif /* (! RUN_TIME) && (! BLOAD_ONLY) &&  DEFRULE_CONSTRUCT */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -