📄 exprnops.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.05 04/09/97 */ /* */ /* EXPRESSION OPERATIONS MODULE */ /*******************************************************//*************************************************************//* Purpose: Provides utility routines for manipulating and *//* examining expressions. *//* *//* Principal Programmer(s): *//* Gary D. Riley *//* *//* Contributing Programmer(s): *//* Brian L. Donnell *//* *//* Revision History: *//* *//*************************************************************/#define _EXPRNOPS_SOURCE_#include "setup.h"#include <stdio.h>#define _CLIPS_STDIO_#if ANSI_COMPILER#include <stdlib.h>#endif#include <string.h>#include <ctype.h>#include "clipsmem.h"#include "router.h"#include "extnfunc.h"#include "cstrnchk.h"#include "prntutil.h"#include "cstrnutl.h"#include "cstrnops.h"#include "exprnops.h"#if (! RUN_TIME)/**************************************************************//* CheckArgumentAgainstRestriction: Compares an argument to a *//* function to the set of restrictions for that function to *//* determine if any incompatibilities exist. If so, the *//* value TRUE is returned, otherwise FALSE is returned. *//* Restrictions checked are: *//* a - external address *//* d - float *//* e - instance address, instance name, or symbol *//* f - float *//* g - integer, float, or symbol *//* h - instance address, instance name, fact address, *//* integer, or symbol *//* i - integer *//* j - symbol, string, or instance name *//* k - symbol or string *//* l - integer *//* m - multifield *//* n - float or integer *//* o - instance name *//* p - instance name or symbol *//* q - string, symbol, or multifield *//* s - string *//* u - unknown (any type allowed) *//* w - symbol *//* x - instance address *//* y - fact address *//* z - fact address, integer, or symbol (*) *//**************************************************************/globle int CheckArgumentAgainstRestriction(theExpression,theRestriction) struct expr *theExpression; int theRestriction; { CONSTRAINT_RECORD *cr1, *cr2, *cr3; /*=============================================*/ /* Generate a constraint record for the actual */ /* argument passed to the function. */ /*=============================================*/ cr1 = ExpressionToConstraintRecord(theExpression); /*================================================*/ /* Generate a constraint record based on the type */ /* of argument expected by the function. */ /*================================================*/ cr2 = ArgumentTypeToConstraintRecord(theRestriction); /*===============================================*/ /* Intersect the two constraint records and then */ /* discard them. */ /*===============================================*/ cr3 = IntersectConstraints(cr1,cr2); RemoveConstraint(cr1); RemoveConstraint(cr2); /*====================================================*/ /* If the intersection of the two constraint records */ /* is empty, then the argument passed to the function */ /* doesn't satisfy the restrictions for the argument. */ /*====================================================*/ if (UnmatchableConstraint(cr3)) { RemoveConstraint(cr3); return(CLIPS_TRUE); } /*===================================================*/ /* The argument satisfies the function restrictions. */ /*===================================================*/ RemoveConstraint(cr3); return(CLIPS_FALSE); }#endif /* (! RUN_TIME) *//************************************************************//* ConstantExpression: Returns CLIPS_TRUE if the expression *//* is a constant, otherwise CLIPS_FALSE. *//************************************************************/globle BOOLEAN ConstantExpression(testPtr) struct expr *testPtr; { while (testPtr != NULL) { if ((testPtr->type != SYMBOL) && (testPtr->type != STRING) &&#if OBJECT_SYSTEM (testPtr->type != INSTANCE_NAME) && (testPtr->type != INSTANCE_ADDRESS) &&#endif (testPtr->type != INTEGER) && (testPtr->type != FLOAT)) { return(CLIPS_FALSE); } testPtr = testPtr->nextArg; } return(CLIPS_TRUE); } /************************************************//* ConstantType: Returns CLIPS_TRUE if the type *//* is a constant, otherwise CLIPS_FALSE. *//************************************************/globle BOOLEAN ConstantType(theType) int theType; { switch (theType) { case SYMBOL: case STRING: case INTEGER: case FLOAT:#if OBJECT_SYSTEM case INSTANCE_NAME: case INSTANCE_ADDRESS:#endif return(CLIPS_TRUE); } return(CLIPS_FALSE); } /*****************************************************************************//* IdenticalExpression: Determines if two expressions are identical. Returns *//* TRUE if the expressions are identical, otherwise FALSE is returned. *//*****************************************************************************/globle BOOLEAN IdenticalExpression(firstList,secondList) struct expr *firstList; struct expr *secondList; { /*==============================================*/ /* Compare each argument in both expressions by */ /* following the nextArg list. */ /*==============================================*/ for (; (firstList != NULL) && (secondList != NULL); firstList = firstList->nextArg, secondList = secondList->nextArg) { /*=========================*/ /* Compare type and value. */ /*=========================*/ if (firstList->type != secondList->type) { return(CLIPS_FALSE); } if (firstList->value != secondList->value) { return (CLIPS_FALSE); } /*==============================*/ /* Compare the arguments lists. */ /*==============================*/ if (IdenticalExpression(firstList->argList,secondList->argList) == CLIPS_FALSE) { return(CLIPS_FALSE); } } /*=====================================================*/ /* If firstList and secondList aren't both NULL, then */ /* one of the lists contains more expressions than the */ /* other. */ /*=====================================================*/ if (firstList != secondList) return(CLIPS_FALSE); /*============================*/ /* Expressions are identical. */ /*============================*/ return(CLIPS_TRUE); }/****************************************************//* CountArguments: Returns the number of structures *//* stored in an expression as traversed through *//* the nextArg pointer but not the argList *//* pointer. *//****************************************************/globle int CountArguments(testPtr) struct expr *testPtr; { int size = 0; while (testPtr != NULL) { size++; testPtr = testPtr->nextArg; } return(size); }/******************************************//* CopyExpresssion: Copies an expression. *//******************************************/globle struct expr *CopyExpression(original) struct expr *original; { struct expr *topLevel, *next, *last; if (original == NULL) return(NULL); topLevel = GenConstant(original->type,original->value); topLevel->argList = CopyExpression(original->argList); last = topLevel; original = original->nextArg; while (original != NULL) { next = GenConstant(original->type,original->value); next->argList = CopyExpression(original->argList); last->nextArg = next; last = next; original = original->nextArg; } return(topLevel); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -