⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exprnpsr.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
   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 + -