📄 tmpltrhs.c
字号:
/*=================================================*/ 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 + -