📄 insqypsr.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.05 04/09/97 */ /* */ /* INSTANCE-SET QUERIES PARSER MODULE */ /*******************************************************//*************************************************************//* Purpose: Instance_set Queries Parsing Routines *//* *//* Principal Programmer(s): *//* Brian L. Donnell *//* *//* Contributing Programmer(s): *//* *//* *//* Revision History: *//* *//*************************************************************/ /* ========================================= ***************************************** EXTERNAL DEFINITIONS ========================================= ***************************************** */#include "setup.h"#if INSTANCE_SET_QUERIES && (! RUN_TIME)#if ANSI_COMPILER#include <string.h>#endif#include "classcom.h"#include "exprnpsr.h"#include "extnfunc.h"#include "insquery.h"#include "prcdrpsr.h"#include "prntutil.h"#include "router.h"#include "scanner.h"#include "strngrtr.h"#define _INSQYPSR_SOURCE_#include "insqypsr.h"/* ========================================= ***************************************** CONSTANTS ========================================= ***************************************** */#define INSTANCE_SLOT_REF ':'/* ========================================= ***************************************** MACROS AND TYPES ========================================= ***************************************** *//* ========================================= ***************************************** INTERNALLY VISIBLE FUNCTION HEADERS ========================================= ***************************************** */#if ANSI_COMPILERstatic EXPRESSION *ParseQueryRestrictions(EXPRESSION *,char *,struct token *);static BOOLEAN ReplaceClassNameWithReference(EXPRESSION *);static int ParseQueryTestExpression(EXPRESSION *,char *);static int ParseQueryActionExpression(EXPRESSION *,char *,EXPRESSION *);static VOID ReplaceInstanceVariables(EXPRESSION *,EXPRESSION *,int,int);static VOID ReplaceSlotReference(EXPRESSION *,EXPRESSION *, struct FunctionDefinition *,int);static int IsQueryFunction(EXPRESSION *);#elsestatic EXPRESSION *ParseQueryRestrictions();static BOOLEAN ReplaceClassNameWithReference();static int ParseQueryTestExpression();static int ParseQueryActionExpression();static VOID ReplaceInstanceVariables();static VOID ReplaceSlotReference();static int IsQueryFunction();#endif /* ========================================= ***************************************** EXTERNALLY VISIBLE GLOBAL VARIABLES ========================================= ***************************************** */ /* ========================================= ***************************************** INTERNALLY VISIBLE GLOBAL VARIABLES ========================================= ***************************************** *//* ========================================= ***************************************** EXTERNALLY VISIBLE FUNCTIONS ========================================= ***************************************** *//*********************************************************************** NAME : ParseQueryNoAction DESCRIPTION : Parses the following functions : (any-instancep) (find-first-instance) (find-all-instances) INPUTS : 1) The address of the top node of the query function 2) The logical name of the input RETURNS : The completed expression chain, or NULL on errors SIDE EFFECTS : The expression chain is extended, or the "top" node is deleted on errors NOTES : CLIPS Syntax : (<function> <query-block>) <query-block> :== (<instance-var>+) <query-expression> <instance-var> :== (<var-name> <class-name>+) Parses into following form : <query-function> | V <query-expression> -> <class-1a> -> <class-1b> -> (QDS) -> <class-2a> -> <class-2b> -> (QDS) -> ... ***********************************************************************/globle EXPRESSION *ParseQueryNoAction(top,readSource) EXPRESSION *top; char *readSource; { EXPRESSION *insQuerySetVars; struct token queryInputToken; insQuerySetVars = ParseQueryRestrictions(top,readSource,&queryInputToken); if (insQuerySetVars == NULL) return(NULL); IncrementIndentDepth(3); PPCRAndIndent(); if (ParseQueryTestExpression(top,readSource) == CLIPS_FALSE) { DecrementIndentDepth(3); ReturnExpression(insQuerySetVars); return(NULL); } DecrementIndentDepth(3); GetToken(readSource,&queryInputToken); if (GetType(queryInputToken) != RPAREN) { SyntaxErrorMessage("instance-set query function"); ReturnExpression(top); ReturnExpression(insQuerySetVars); return(NULL); } ReplaceInstanceVariables(insQuerySetVars,top->argList,CLIPS_TRUE,0); ReturnExpression(insQuerySetVars); return(top); } /*********************************************************************** NAME : ParseQueryAction DESCRIPTION : Parses the following functions : (do-for-instance) (do-for-all-instances) (delayed-do-for-all-instances) INPUTS : 1) The address of the top node of the query function 2) The logical name of the input RETURNS : The completed expression chain, or NULL on errors SIDE EFFECTS : The expression chain is extended, or the "top" node is deleted on errors NOTES : CLIPS Syntax : (<function> <query-block> <query-action>) <query-block> :== (<instance-var>+) <query-expression> <instance-var> :== (<var-name> <class-name>+) Parses into following form : <query-function> | V <query-expression> -> <query-action> -> <class-1a> -> <class-1b> -> (QDS) -> <class-2a> -> <class-2b> -> (QDS) -> ... ***********************************************************************/globle EXPRESSION *ParseQueryAction(top,readSource) EXPRESSION *top; char *readSource; { EXPRESSION *insQuerySetVars; struct token queryInputToken; insQuerySetVars = ParseQueryRestrictions(top,readSource,&queryInputToken); if (insQuerySetVars == NULL) return(NULL); IncrementIndentDepth(3); PPCRAndIndent(); if (ParseQueryTestExpression(top,readSource) == CLIPS_FALSE) { DecrementIndentDepth(3); ReturnExpression(insQuerySetVars); return(NULL); } PPCRAndIndent(); if (ParseQueryActionExpression(top,readSource,insQuerySetVars) == CLIPS_FALSE) { DecrementIndentDepth(3); ReturnExpression(insQuerySetVars); return(NULL); } DecrementIndentDepth(3); GetToken(readSource,&queryInputToken); if (GetType(queryInputToken) != RPAREN) { SyntaxErrorMessage("instance-set query function"); ReturnExpression(top); ReturnExpression(insQuerySetVars); return(NULL); } ReplaceInstanceVariables(insQuerySetVars,top->argList,CLIPS_TRUE,0); ReplaceInstanceVariables(insQuerySetVars,top->argList->nextArg,CLIPS_FALSE,0); ReturnExpression(insQuerySetVars); return(top); }/* ========================================= ***************************************** INTERNALLY VISIBLE FUNCTIONS ========================================= ***************************************** */ /*************************************************************** NAME : ParseQueryRestrictions DESCRIPTION : Parses the class restrictions for a query INPUTS : 1) The top node of the query expression 2) The logical name of the input 3) Caller's token buffer RETURNS : The instance-variable expressions SIDE EFFECTS : Entire query expression deleted on errors Nodes allocated for restrictions and instance variable expressions Class restrictions attached to query-expression as arguments NOTES : Expects top != NULL ***************************************************************/static EXPRESSION *ParseQueryRestrictions(top,readSource,queryInputToken) EXPRESSION *top; char *readSource; struct token *queryInputToken; { EXPRESSION *insQuerySetVars = NULL,*lastInsQuerySetVars = NULL, *classExp = NULL,*lastClassExp, *tmp,*lastOne = NULL; int error = CLIPS_FALSE; SavePPBuffer(" "); GetToken(readSource,queryInputToken); if (queryInputToken->type != LPAREN) goto ParseQueryRestrictionsError1; GetToken(readSource,queryInputToken); if (queryInputToken->type != LPAREN) goto ParseQueryRestrictionsError1; while (queryInputToken->type == LPAREN) { GetToken(readSource,queryInputToken); if (queryInputToken->type != SF_VARIABLE) goto ParseQueryRestrictionsError1; tmp = insQuerySetVars; while (tmp != NULL) { if (tmp->value == queryInputToken->value) { PrintErrorID("INSQYPSR",1,CLIPS_FALSE); PrintCLIPS(WERROR,"Duplicate instance member variable name in function "); PrintCLIPS(WERROR,ValueToString(ExpressionFunctionCallName(top))); PrintCLIPS(WERROR,".\n"); goto ParseQueryRestrictionsError2; } tmp = tmp->nextArg; } tmp = GenConstant(SF_VARIABLE,queryInputToken->value); if (insQuerySetVars == NULL) insQuerySetVars = tmp; else lastInsQuerySetVars->nextArg = tmp; lastInsQuerySetVars = tmp; SavePPBuffer(" "); classExp = ArgumentParse(readSource,&error); if (error) goto ParseQueryRestrictionsError2; if (classExp == NULL) goto ParseQueryRestrictionsError1; if (ReplaceClassNameWithReference(classExp) == CLIPS_FALSE) goto ParseQueryRestrictionsError2; lastClassExp = classExp; SavePPBuffer(" "); while ((tmp = ArgumentParse(readSource,&error)) != NULL) { if (ReplaceClassNameWithReference(tmp) == CLIPS_FALSE) goto ParseQueryRestrictionsError2; lastClassExp->nextArg = tmp; lastClassExp = tmp; SavePPBuffer(" "); } if (error) goto ParseQueryRestrictionsError2; PPBackup(); PPBackup(); SavePPBuffer(")"); tmp = GenConstant(SYMBOL,(VOID *) QUERY_DELIMETER_SYMBOL); lastClassExp->nextArg = tmp; lastClassExp = tmp; if (top->argList == NULL) top->argList = classExp; else lastOne->nextArg = classExp; lastOne = lastClassExp; classExp = NULL; SavePPBuffer(" "); GetToken(readSource,queryInputToken); } if (queryInputToken->type != RPAREN) goto ParseQueryRestrictionsError1; PPBackup(); PPBackup(); SavePPBuffer(")"); return(insQuerySetVars); ParseQueryRestrictionsError1: SyntaxErrorMessage("instance-set query function");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -