/*********************************************************************** NAME : FactParseQueryAction DESCRIPTION : Parses the following functions : (do-for-fact) (do-for-all-facts) (delayed-do-for-all-facts) 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 : H/L Syntax : (<function> <query-block> <query-action>) <query-block> :== (<fact-var>+) <query-expression> <fact-var> :== (<var-name> <template-name>+) Parses into following form : <query-function> | V <query-expression> -> <query-action> -> <template-1a> -> <template-1b> -> (QDS) -> <template-2a> -> <template-2b> -> (QDS) -> ... ***********************************************************************/ globle EXPRESSION *FactParseQueryAction( void *theEnv, EXPRESSION *top, const char *readSource) { EXPRESSION *factQuerySetVars; struct token queryInputToken; factQuerySetVars = ParseQueryRestrictions(theEnv,top,readSource,&queryInputToken); if (factQuerySetVars == NULL) { return(NULL); } IncrementIndentDepth(theEnv,3); PPCRAndIndent(theEnv); if (ParseQueryTestExpression(theEnv,top,readSource) == FALSE) { DecrementIndentDepth(theEnv,3); ReturnExpression(theEnv,factQuerySetVars); return(NULL); } PPCRAndIndent(theEnv); if (ParseQueryActionExpression(theEnv,top,readSource,factQuerySetVars,&queryInputToken) == FALSE) { DecrementIndentDepth(theEnv,3); ReturnExpression(theEnv,factQuerySetVars); return(NULL); } DecrementIndentDepth(theEnv,3); if (GetType(queryInputToken) != RPAREN) { SyntaxErrorMessage(theEnv,"fact-set query function"); ReturnExpression(theEnv,top); ReturnExpression(theEnv,factQuerySetVars); return(NULL); } ReplaceFactVariables(theEnv,factQuerySetVars,top->argList,TRUE,0); ReplaceFactVariables(theEnv,factQuerySetVars,top->argList->nextArg,FALSE,0); ReturnExpression(theEnv,factQuerySetVars); 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 : H/L 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( void *theEnv, EXEC_STATUS, EXPRESSION *top, char *readSource) { EXPRESSION *insQuerySetVars; struct token queryInputToken; insQuerySetVars = ParseQueryRestrictions(theEnv,execStatus,top,readSource,&queryInputToken); if (insQuerySetVars == NULL) return(NULL); IncrementIndentDepth(theEnv,execStatus,3); PPCRAndIndent(theEnv,execStatus); if (ParseQueryTestExpression(theEnv,execStatus,top,readSource) == FALSE) { DecrementIndentDepth(theEnv,execStatus,3); ReturnExpression(theEnv,execStatus,insQuerySetVars); return(NULL); } PPCRAndIndent(theEnv,execStatus); if (ParseQueryActionExpression(theEnv,execStatus,top,readSource,insQuerySetVars,&queryInputToken) == FALSE) { DecrementIndentDepth(theEnv,execStatus,3); ReturnExpression(theEnv,execStatus,insQuerySetVars); return(NULL); } DecrementIndentDepth(theEnv,execStatus,3); if (GetType(queryInputToken) != RPAREN) { SyntaxErrorMessage(theEnv,execStatus,"instance-set query function"); ReturnExpression(theEnv,execStatus,top); ReturnExpression(theEnv,execStatus,insQuerySetVars); return(NULL); } ReplaceInstanceVariables(theEnv,execStatus,insQuerySetVars,top->argList,TRUE,0); ReplaceInstanceVariables(theEnv,execStatus,insQuerySetVars,top->argList->nextArg,FALSE,0); ReturnExpression(theEnv,execStatus,insQuerySetVars); return(top); }