📄 exprnpsr.c
字号:
}
}
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 + -