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

📄 tmpltrhs.c

📁 NASA 开发使用的一个专家系统
💻 C
📖 第 1 页 / 共 2 页
字号:
      /*=================================================*/            if (newField == NULL)       {        *error = CLIPS_TRUE;        SingleFieldSlotCardinalityError(slotPtr->slotName->contents);        return(NULL);       }      /*==============================================*/      /* A function returning a multifield value can  */      /* not be called to get the value for the slot. */      /*==============================================*/            if ((newField->type == FCALL) ? (ExpressionFunctionType(newField) == 'm') :                                      (newField->type == MF_VARIABLE))       {        *error = CLIPS_TRUE;        SingleFieldSlotCardinalityError(slotPtr->slotName->contents);        ReturnExpression(newField);        return(NULL);       }      /*============================*/      /* Move on to the next token. */      /*============================*/            GetToken(inputSource,tempToken);     }   /*========================================*/   /* Handle a multifield slot. Build a list */   /* of the values stored in the slot.      */   /*========================================*/   else     {      SavePPBuffer(" ");      valueList = GetAssertArgument(inputSource,tempToken,                                     error,RPAREN,constantsOnly,&printError);      if (*error)        {         if (printError) SyntaxErrorMessage("deftemplate pattern");         return(NULL);        }      if (valueList == NULL)        {         PPBackup();         PPBackup();         SavePPBuffer(")");        }              lastValue = valueList;      while (lastValue != NULL) /* (tempToken->type != RPAREN) */        {         if (tempToken->type == RPAREN)           { SavePPBuffer(" "); }         else           {            /* PPBackup(); */            SavePPBuffer(" ");            /* SavePPBuffer(tempToken->printForm); */           }         newField = GetAssertArgument(inputSource,tempToken,error,RPAREN,constantsOnly,&printError);         if (*error)           {            if (printError) SyntaxErrorMessage("deftemplate pattern");            ReturnExpression(valueList);            return(NULL);           }         if (newField == NULL)           {            PPBackup();            PPBackup();            SavePPBuffer(")");           }                    lastValue->nextArg = newField;         lastValue = newField;        }      newField = valueList;     }   /*==========================================================*/   /* Slot definition must be closed with a right parenthesis. */   /*==========================================================*/   if (tempToken->type != RPAREN)     {      SingleFieldSlotCardinalityError(slotPtr->slotName->contents);      *error = CLIPS_TRUE;      ReturnExpression(newField);      return(NULL);     }   /*=========================================================*/   /* Build and return a structure describing the slot value. */   /*=========================================================*/   nextSlot = GenConstant(SYMBOL,slotPtr->slotName);   nextSlot->argList = newField;   return(nextSlot);  }/*************************************************************************//* ReorderAssertSlotValues: Rearranges the asserted values to correspond *//*   to the order of the values described by the deftemplate.            *//*************************************************************************/static struct expr *ReorderAssertSlotValues(slotPtr,firstSlot,error)  struct templateSlot *slotPtr;  struct expr *firstSlot;  int *error;  {   struct expr *firstArg = NULL;   struct expr *lastArg = NULL, *newArg;   /*=============================================*/   /* Loop through each of the slots in the order */   /* they're found in the deftemplate.           */   /*=============================================*/      for (;        slotPtr != NULL;        slotPtr = slotPtr->next)     {      /*==============================================*/      /* Get either the value specified in the assert */      /* command or the default value for the slot.   */      /*==============================================*/            newArg = GetSlotAssertValues(slotPtr,firstSlot,error);      if (*error)        {          ReturnExpression(firstArg);         return(NULL);        }              /*=====================================*/      /* Add the value to the list of values */      /* for the assert command.             */      /*=====================================*/            if (newArg != NULL)        {         if (lastArg == NULL)           { firstArg = newArg; }         else           { lastArg->nextArg = newArg; }         lastArg = newArg;        }     }   /*==============================*/   /* Return the list of arguments */   /* for the assert command.      */   /*==============================*/      return(firstArg);  }/***************************************************************//* GetSlotAssertValues: Gets the assert value for a given slot *//*   of a deftemplate. If the value was supplied by the user,  *//*   it will be used. If not the default value or default      *//*   default value will be used.                               *//***************************************************************/static struct expr *GetSlotAssertValues(slotPtr,firstSlot,error)  struct templateSlot *slotPtr;  struct expr *firstSlot;  int *error;  {   struct expr *slotItem;   struct expr *newArg, *tempArg;   DATA_OBJECT theDefault;   /*==================================================*/   /* Determine if the slot is assigned in the assert. */   /*==================================================*/   slotItem = FindAssertSlotItem(slotPtr,firstSlot);   /*==========================================*/   /* If the slot is assigned, use that value. */   /*==========================================*/   if (slotItem != NULL)     {      newArg = slotItem->argList;      slotItem->argList = NULL;     }   /*=================================*/   /* Otherwise, use a default value. */   /*=================================*/   else     {      /*================================================*/      /* If the (default ?NONE) attribute was specified */      /* for the slot, then a value must be supplied.   */      /*================================================*/            if (slotPtr->noDefault)        {         PrintErrorID("TMPLTRHS",1,CLIPS_TRUE);         PrintCLIPS(WERROR,"Slot ");         PrintCLIPS(WERROR,slotPtr->slotName->contents);         PrintCLIPS(WERROR," requires a value because of its (default ?NONE) attribute.\n");         *error = CLIPS_TRUE;         return(NULL);        }              /*===================================================*/      /* If the (default ?DERIVE) attribute was specified  */      /* (the default), then derive the default value from */      /* the slot's constraints.                           */      /*===================================================*/            else if ((slotPtr->defaultPresent == CLIPS_FALSE) &&               (slotPtr->defaultDynamic == CLIPS_FALSE))        {          DeriveDefaultFromConstraints(slotPtr->constraints,&theDefault,                                      (int) slotPtr->multislot);         newArg = ConvertValueToExpression(&theDefault);         }              /*=========================================*/      /* Otherwise, use the expression contained */      /* in the default attribute.               */      /*=========================================*/            else        { newArg = CopyExpression(slotPtr->defaultList); }     }   /*=======================================================*/   /* Since a multifield slot default can contain a list of */   /* values, the values need to have a store-multifield    */   /* function called wrapped around it to group all of the */   /* values into a single multifield value.                */   /*=======================================================*/      if (slotPtr->multislot)     {      tempArg = GenConstant(FACT_STORE_MULTIFIELD,AddBitMap("\0",1));      tempArg->argList = newArg;      newArg = tempArg;     }      /*==============================================*/   /* Return the value to be asserted in the slot. */   /*==============================================*/   return(newArg);  }  /*******************************************************************//* FindAssertSlotItem: Finds a particular slot in a list of slots. *//*******************************************************************/static struct expr *FindAssertSlotItem(slotPtr,listOfSlots)  struct templateSlot *slotPtr;  struct expr *listOfSlots;  {   while (listOfSlots != NULL)     {      if (listOfSlots->value == (VOID *) slotPtr->slotName) return (listOfSlots);      listOfSlots = listOfSlots->nextArg;     }   return(NULL);  }#endif /* DEFTEMPLATE_CONSTRUCT */

⌨️ 快捷键说明

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