📄 exprnpsr.c
字号:
else { return(FALSE); } /*============================================*/ /* Check for the correct number of arguments. */ /*============================================*/ if (number1 == number2) { if (argCount != number1) { ExpectedCountError(theEnv,functionName,EXACTLY,number1); return(TRUE); } } else if (argCount < number1) { ExpectedCountError(theEnv,functionName,AT_LEAST,number1); return(TRUE); } else if (argCount > number2) { ExpectedCountError(theEnv,functionName,NO_MORE_THAN,number2); return(TRUE); } /*=======================================*/ /* Check for the default argument types. */ /*=======================================*/ defaultRestriction = restrictions[i]; if (defaultRestriction == '\0') { defaultRestriction = 'u'; } else if (defaultRestriction == '*') { defaultRestriction = 'u'; i++; } else { i++; } /*======================*/ /* Check each argument. */ /*======================*/ for (argPtr = theExpression->argList; argPtr != NULL; argPtr = argPtr->nextArg) { argRestriction = restrictions[i]; if (argRestriction == '\0') { argRestriction = defaultRestriction; } else { i++; } if (argRestriction != '*') { theRestriction = (int) argRestriction; } else { theRestriction = (int) defaultRestriction; } if (CheckArgumentAgainstRestriction(theEnv,argPtr,theRestriction)) { ExpectedTypeError1(theEnv,functionName,j,GetArgumentTypeName(theRestriction)); return(TRUE); } j++; } return(FALSE); }/*******************************************************//* CollectArguments: Parses and groups together all of *//* the arguments for a function call expression. *//*******************************************************/globle struct expr *CollectArguments( void *theEnv, struct expr *top, char *logicalName) { int errorFlag; struct expr *lastOne, *nextOne; /*========================================*/ /* Default parsing routine for functions. */ /*========================================*/ lastOne = NULL; while (TRUE) { SavePPBuffer(theEnv," "); errorFlag = FALSE; nextOne = ArgumentParse(theEnv,logicalName,&errorFlag); if (errorFlag == TRUE) { ReturnExpression(theEnv,top); return(NULL); } if (nextOne == NULL) { PPBackup(theEnv); PPBackup(theEnv); SavePPBuffer(theEnv,")"); return(top); } if (lastOne == NULL) { top->argList = nextOne; } else { lastOne->nextArg = nextOne; } lastOne = nextOne; } }/********************************************//* ArgumentParse: Parses an argument within *//* a function call expression. *//********************************************/globle struct expr *ArgumentParse( void *theEnv, char *logicalName, int *errorFlag) { struct expr *top; struct token theToken; /*===============*/ /* Grab a token. */ /*===============*/ GetToken(theEnv,logicalName,&theToken); /*============================*/ /* ')' counts as no argument. */ /*============================*/ if (theToken.type == RPAREN) { return(NULL); } /*================================*/ /* Parse constants and variables. */ /*================================*/ if ((theToken.type == SF_VARIABLE) || (theToken.type == MF_VARIABLE) || (theToken.type == SYMBOL) || (theToken.type == STRING) ||#if DEFGLOBAL_CONSTRUCT (theToken.type == GBL_VARIABLE) || (theToken.type == MF_GBL_VARIABLE) ||#endif#if OBJECT_SYSTEM (theToken.type == INSTANCE_NAME) ||#endif (theToken.type == FLOAT) || (theToken.type == INTEGER)) { return(GenConstant(theEnv,theToken.type,theToken.value)); } /*======================*/ /* Parse function call. */ /*======================*/ if (theToken.type != LPAREN) { PrintErrorID(theEnv,"EXPRNPSR",2,TRUE); EnvPrintRouter(theEnv,WERROR,"Expected a constant, variable, or expression.\n"); *errorFlag = TRUE; return(NULL); } top = Function1Parse(theEnv,logicalName); if (top == NULL) *errorFlag = TRUE; return(top); }/************************************************************//* ParseAtomOrExpression: Parses an expression which may be *//* a function call, atomic value (string, symbol, etc.), *//* or variable (local or global). *//************************************************************/globle struct expr *ParseAtomOrExpression( void *theEnv, char *logicalName, struct token *useToken) { struct token theToken, *thisToken; struct expr *rv; if (useToken == NULL) { thisToken = &theToken; GetToken(theEnv,logicalName,thisToken); } else thisToken = useToken; if ((thisToken->type == SYMBOL) || (thisToken->type == STRING) || (thisToken->type == INTEGER) || (thisToken->type == FLOAT) ||#if OBJECT_SYSTEM (thisToken->type == INSTANCE_NAME) ||#endif#if DEFGLOBAL_CONSTRUCT (thisToken->type == GBL_VARIABLE) || (thisToken->type == MF_GBL_VARIABLE) ||#endif (thisToken->type == SF_VARIABLE) || (thisToken->type == MF_VARIABLE)) { rv = GenConstant(theEnv,thisToken->type,thisToken->value); } else if (thisToken->type == LPAREN) { rv = Function1Parse(theEnv,logicalName); if (rv == NULL) return(NULL); } else { PrintErrorID(theEnv,"EXPRNPSR",2,TRUE); EnvPrintRouter(theEnv,WERROR,"Expected a constant, variable, or expression.\n"); return(NULL); } return(rv); }/*********************************************//* GroupActions: Groups together a series of *//* actions within a progn expression. Used *//* for example to parse the RHS of a rule. *//*********************************************/globle struct expr *GroupActions( void *theEnv, char *logicalName, struct token *theToken, int readFirstToken, char *endWord, int functionNameParsed) { struct expr *top, *nextOne, *lastOne = NULL; /*=============================*/ /* Create the enclosing progn. */ /*=============================*/ top = GenConstant(theEnv,FCALL,FindFunction(theEnv,"progn")); /*========================================================*/ /* Continue until all appropriate commands are processed. */ /*========================================================*/ while (TRUE) { /*================================================*/ /* Skip reading in the token if this is the first */ /* pass and the initial token was already read */ /* before calling this function. */ /*================================================*/ if (readFirstToken) { GetToken(theEnv,logicalName,theToken); } else { readFirstToken = TRUE; } /*=================================================*/ /* Look to see if a symbol has terminated the list */ /* of actions (such as "else" in an if function). */ /*=================================================*/ if ((theToken->type == SYMBOL) && (endWord != NULL) && (! functionNameParsed)) { if (strcmp(ValueToString(theToken->value),endWord) == 0) { return(top); } } /*====================================*/ /* Process a function if the function */ /* name has already been read. */ /*====================================*/ if (functionNameParsed) { nextOne = Function2Parse(theEnv,logicalName,ValueToString(theToken->value)); functionNameParsed = FALSE; } /*========================================*/ /* Process a constant or global variable. */ /*========================================*/ else if ((theToken->type == SYMBOL) || (theToken->type == STRING) || (theToken->type == INTEGER) || (theToken->type == FLOAT) ||#if DEFGLOBAL_CONSTRUCT (theToken->type == GBL_VARIABLE) || (theToken->type == MF_GBL_VARIABLE) ||#endif#if OBJECT_SYSTEM (theToken->type == INSTANCE_NAME) ||#endif (theToken->type == SF_VARIABLE) || (theToken->type == MF_VARIABLE)) { nextOne = GenConstant(theEnv,theToken->type,theToken->value); } /*=============================*/ /* Otherwise parse a function. */ /*=============================*/ else if (theToken->type == LPAREN) { nextOne = Function1Parse(theEnv,logicalName); } /*======================================*/ /* Otherwise replace sequence expansion */ /* variables and return the expression. */ /*======================================*/ else { if (ReplaceSequenceExpansionOps(theEnv,top,NULL, FindFunction(theEnv,"(expansion-call)"), FindFunction(theEnv,"expand$"))) { ReturnExpression(theEnv,top); return(NULL); } return(top); } /*===========================*/ /* Add the new action to the */ /* list of progn arguments. */ /*===========================*/ if (nextOne == NULL) { theToken->type = UNKNOWN_VALUE; ReturnExpression(theEnv,top); return(NULL); } if (lastOne == NULL) { top->argList = nextOne; } else { lastOne->nextArg = nextOne; } lastOne = nextOne; PPCRAndIndent(theEnv); } }#endif /* (! RUN_TIME) *//********************************************************//* EnvSetSequenceOperatorRecognition: C access routine *//* for the set-sequence-operator-recognition function *//********************************************************/globle intBool EnvSetSequenceOperatorRecognition( void *theEnv, int value) { int ov; ov = ExpressionData(theEnv)->SequenceOpMode; ExpressionData(theEnv)->SequenceOpMode = value; return(ov); }/********************************************************//* EnvSetSequenceOperatorRecognition: C access routine *//* for the Get-sequence-operator-recognition function *//********************************************************/globle intBool EnvGetSequenceOperatorRecognition( void *theEnv) { return(ExpressionData(theEnv)->SequenceOpMode); }/*******************************************//* ParseConstantArguments: Parses a string *//* into a set of constant expressions. *//*******************************************/globle EXPRESSION *ParseConstantArguments( void *theEnv, char *argstr, int *error) { EXPRESSION *top = NULL,*bot = NULL,*tmp; char *router = "***FNXARGS***"; struct token tkn; *error = FALSE; if (argstr == NULL) return(NULL); /*=====================================*/ /* Open the string as an input source. */ /*=====================================*/ if (OpenStringSource(theEnv,router,argstr,0) == 0) { PrintErrorID(theEnv,"EXPRNPSR",6,FALSE); EnvPrintRouter(theEnv,WERROR,"Cannot read arguments for external call.\n"); *error = TRUE; return(NULL); } /*======================*/ /* Parse the constants. */ /*======================*/ GetToken(theEnv,router,&tkn); while (tkn.type != STOP) { if ((tkn.type != SYMBOL) && (tkn.type != STRING) && (tkn.type != FLOAT) && (tkn.type != INTEGER) && (tkn.type != INSTANCE_NAME)) { PrintErrorID(theEnv,"EXPRNPSR",7,FALSE); EnvPrintRouter(theEnv,WERROR,"Only constant arguments allowed for external function call.\n"); ReturnExpression(theEnv,top); *error = TRUE; CloseStringSource(theEnv,router); return(NULL); } tmp = GenConstant(theEnv,tkn.type,tkn.value); if (top == NULL) top = tmp; else bot->nextArg = tmp; bot = tmp; GetToken(theEnv,router,&tkn); } /*================================*/ /* Close the string input source. */ /*================================*/ CloseStringSource(theEnv,router); /*=======================*/ /* Return the arguments. */ /*=======================*/ return(top); }/*********************************************//* RemoveUnneededProgn: *//*********************************************/globle struct expr *RemoveUnneededProgn( void *theEnv, struct expr *theExpression) { struct FunctionDefinition *fptr; struct expr *temp; if (theExpression == NULL) return(theExpression); if (theExpression->type != FCALL) return(theExpression); fptr = (struct FunctionDefinition *) theExpression->value; if (fptr->functionPointer != PTIF PrognFunction) { return(theExpression); } if ((theExpression->argList != NULL) && (theExpression->argList->nextArg == NULL)) { temp = theExpression; theExpression = theExpression->argList; temp->argList = NULL; temp->nextArg = NULL; ReturnExpression(theEnv,temp); } return(theExpression); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -