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

📄 tmpltpsr.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
     }  SavePPBuffer(theEnv,"\n");  /*=======================*/  /* Return the slot list. */  /*=======================*/  return(slotList); }/*****************************************************//* ParseSlot: Parses a single slot of a deftemplate. *//*****************************************************/static struct templateSlot *ParseSlot(  void *theEnv,  char *readSource,  struct token *inputToken,  struct templateSlot *slotList)  {   int parsingMultislot;   SYMBOL_HN *slotName;   struct templateSlot *newSlot;   int rv;   /*=====================================================*/   /* Slots must  begin with keyword field or multifield. */   /*=====================================================*/   if ((strcmp(ValueToString(inputToken->value),"field") != 0) &&       (strcmp(ValueToString(inputToken->value),"multifield") != 0) &&       (strcmp(ValueToString(inputToken->value),"slot") != 0) &&       (strcmp(ValueToString(inputToken->value),"multislot") != 0))     {      SyntaxErrorMessage(theEnv,"deftemplate");      DeftemplateData(theEnv)->DeftemplateError = TRUE;      return(NULL);     }   /*===============================================*/   /* Determine if multifield slot is being parsed. */   /*===============================================*/   if ((strcmp(ValueToString(inputToken->value),"multifield") == 0) ||       (strcmp(ValueToString(inputToken->value),"multislot") == 0))     { parsingMultislot = TRUE; }   else     { parsingMultislot = FALSE; }   /*========================================*/   /* The name of the slot must be a symbol. */   /*========================================*/   SavePPBuffer(theEnv," ");   GetToken(theEnv,readSource,inputToken);   if (inputToken->type != SYMBOL)     {      SyntaxErrorMessage(theEnv,"deftemplate");      DeftemplateData(theEnv)->DeftemplateError = TRUE;      return(NULL);     }   slotName = (SYMBOL_HN *) inputToken->value;   /*================================================*/   /* Determine if the slot has already been parsed. */   /*================================================*/   while (slotList != NULL)     {      if (slotList->slotName == slotName)        {         AlreadyParsedErrorMessage(theEnv,"slot ",ValueToString(slotList->slotName));         DeftemplateData(theEnv)->DeftemplateError = TRUE;         return(NULL);        }      slotList = slotList->next;     }   /*===================================*/   /* Parse the attributes of the slot. */   /*===================================*/   newSlot = DefinedSlots(theEnv,readSource,slotName,parsingMultislot,inputToken);   if (newSlot == NULL)     {      DeftemplateData(theEnv)->DeftemplateError = TRUE;      return(NULL);     }   /*=================================*/   /* Check for slot conflict errors. */   /*=================================*/   if (CheckConstraintParseConflicts(theEnv,newSlot->constraints) == FALSE)     {      ReturnSlots(theEnv,newSlot);      DeftemplateData(theEnv)->DeftemplateError = TRUE;      return(NULL);     }   if ((newSlot->defaultPresent) || (newSlot->defaultDynamic))     { rv = ConstraintCheckExpressionChain(theEnv,newSlot->defaultList,newSlot->constraints); }   else     { rv = NO_VIOLATION; }   if ((rv != NO_VIOLATION) && EnvGetStaticConstraintChecking(theEnv))     {      char *temp;      if (newSlot->defaultDynamic) temp = "the default-dynamic attribute";      else temp = "the default attribute";      ConstraintViolationErrorMessage(theEnv,"An expression",temp,FALSE,0,                                      newSlot->slotName,0,rv,newSlot->constraints,TRUE);      ReturnSlots(theEnv,newSlot);      DeftemplateData(theEnv)->DeftemplateError = TRUE;      return(NULL);     }   /*==================*/   /* Return the slot. */   /*==================*/   return(newSlot);  }/**************************************************************//* DefinedSlots: Parses a field or multifield slot attribute. *//**************************************************************/static struct templateSlot *DefinedSlots(  void *theEnv,  char *readSource,  SYMBOL_HN *slotName,  int multifieldSlot,  struct token *inputToken)  {   struct templateSlot *newSlot;   struct expr *defaultList;   int defaultFound = FALSE;   int noneSpecified, deriveSpecified;   CONSTRAINT_PARSE_RECORD parsedConstraints;   /*===========================*/   /* Build the slot container. */   /*===========================*/   newSlot = get_struct(theEnv,templateSlot);   newSlot->slotName = slotName;   newSlot->defaultList = NULL;   newSlot->constraints = GetConstraintRecord(theEnv);   if (multifieldSlot)     { newSlot->constraints->multifieldsAllowed = TRUE; }   newSlot->multislot = multifieldSlot;   newSlot->noDefault = FALSE;   newSlot->defaultPresent = FALSE;   newSlot->defaultDynamic = FALSE;   newSlot->next = NULL;   /*========================================*/   /* Parse the primitive slot if it exists. */   /*========================================*/   InitializeConstraintParseRecord(&parsedConstraints);   GetToken(theEnv,readSource,inputToken);   while (inputToken->type != RPAREN)     {      PPBackup(theEnv);      SavePPBuffer(theEnv," ");      SavePPBuffer(theEnv,inputToken->printForm);      /*================================================*/      /* Slot attributes begin with a left parenthesis. */      /*================================================*/      if (inputToken->type != LPAREN)        {         SyntaxErrorMessage(theEnv,"deftemplate");         ReturnSlots(theEnv,newSlot);         DeftemplateData(theEnv)->DeftemplateError = TRUE;         return(NULL);        }      /*=============================================*/      /* The name of the attribute must be a symbol. */      /*=============================================*/      GetToken(theEnv,readSource,inputToken);      if (inputToken->type != SYMBOL)        {         SyntaxErrorMessage(theEnv,"deftemplate");         ReturnSlots(theEnv,newSlot);         DeftemplateData(theEnv)->DeftemplateError = TRUE;         return(NULL);        }      /*================================================================*/      /* Determine if the attribute is one of the standard constraints. */      /*================================================================*/      if (StandardConstraint(ValueToString(inputToken->value)))        {         if (ParseStandardConstraint(theEnv,readSource,(ValueToString(inputToken->value)),                                     newSlot->constraints,&parsedConstraints,                                     multifieldSlot) == FALSE)           {            DeftemplateData(theEnv)->DeftemplateError = TRUE;            ReturnSlots(theEnv,newSlot);            return(NULL);           }        }      /*=================================================*/      /* else if the attribute is the default attribute, */      /* then get the default list for this slot.        */      /*=================================================*/      else if ((strcmp(ValueToString(inputToken->value),"default") == 0) ||               (strcmp(ValueToString(inputToken->value),"default-dynamic") == 0))        {         /*======================================================*/         /* Check to see if the default has already been parsed. */         /*======================================================*/         if (defaultFound)           {            AlreadyParsedErrorMessage(theEnv,"default attribute",NULL);            DeftemplateData(theEnv)->DeftemplateError = TRUE;            ReturnSlots(theEnv,newSlot);            return(NULL);           }         newSlot->noDefault = FALSE;         /*=====================================================*/         /* Determine whether the default is dynamic or static. */         /*=====================================================*/         if (strcmp(ValueToString(inputToken->value),"default") == 0)           {            newSlot->defaultPresent = TRUE;            newSlot->defaultDynamic = FALSE;           }         else           {            newSlot->defaultPresent = FALSE;            newSlot->defaultDynamic = TRUE;           }         /*===================================*/         /* Parse the list of default values. */         /*===================================*/         defaultList = ParseDefault(theEnv,readSource,multifieldSlot,(int) newSlot->defaultDynamic,                                  TRUE,&noneSpecified,&deriveSpecified,&DeftemplateData(theEnv)->DeftemplateError);         if (DeftemplateData(theEnv)->DeftemplateError == TRUE)           {            ReturnSlots(theEnv,newSlot);            return(NULL);           }         /*==================================*/         /* Store the default with the slot. */         /*==================================*/         defaultFound = TRUE;         if (deriveSpecified) newSlot->defaultPresent = FALSE;         else if (noneSpecified)           {            newSlot->noDefault = TRUE;            newSlot->defaultPresent = FALSE;           }         newSlot->defaultList = defaultList;        }      /*============================================*/      /* Otherwise the attribute is an invalid one. */      /*============================================*/      else        {         SyntaxErrorMessage(theEnv,"slot attributes");         ReturnSlots(theEnv,newSlot);         DeftemplateData(theEnv)->DeftemplateError = TRUE;         return(NULL);        }      /*===================================*/      /* Begin parsing the next attribute. */      /*===================================*/      GetToken(theEnv,readSource,inputToken);     }   /*============================*/   /* Return the attribute list. */   /*============================*/   return(newSlot);  }#endif /* (! RUN_TIME) && (! BLOAD_ONLY) */#endif /* DEFTEMPLATE_CONSTRUCT */

⌨️ 快捷键说明

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