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

📄 inspsr.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
              }            PPCRAndIndent(theEnv);            GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);           }         else           top->argList->nextArg = GenConstant(theEnv,FCALL,(void *) FindFunction(theEnv,"gensym*"));         top->argList->nextArg->nextArg = ParseSlotOverrides(theEnv,readSource,&error);        }      else        top->argList->nextArg = ParseSlotOverrides(theEnv,readSource,&error);     }   if (error)      goto ParseInitializeInstanceError;   if (GetType(DefclassData(theEnv)->ObjectParseToken) != RPAREN)     {      SyntaxErrorMessage(theEnv,"slot-override");      goto ParseInitializeInstanceError;     }   DecrementIndentDepth(theEnv,3);   return(top);ParseInitializeInstanceError:   SetEvaluationError(theEnv,TRUE);   ReturnExpression(theEnv,top);   DecrementIndentDepth(theEnv,3);   return(NULL);  }/********************************************************************************  NAME         : ParseSlotOverrides  DESCRIPTION  : Forms expressions for slot-overrides  INPUTS       : 1) The logical name of the input                 2) Caller's buffer for error flkag  RETURNS      : Address override expressions, NULL                   if none or error.  SIDE EFFECTS : Slot-expression built                 Caller's error flag set  NOTES        : <slot-override> ::= (<slot-name> <value>*)*                 goes to                 <slot-name> --> <dummy-node> --> <slot-name> --> <dummy-node>...                                       |                                       V                               <value-expression> --> <value-expression> --> ...                 Assumes first token has already been scanned ********************************************************************************/globle EXPRESSION *ParseSlotOverrides(  void *theEnv,  char *readSource,  int *error)  {   EXPRESSION *top = NULL,*bot = NULL,*theExp;   while (GetType(DefclassData(theEnv)->ObjectParseToken) == LPAREN)     {      *error = FALSE;      theExp = ArgumentParse(theEnv,readSource,error);      if (*error == TRUE)        {         ReturnExpression(theEnv,top);         return(NULL);        }      else if (theExp == NULL)        {         SyntaxErrorMessage(theEnv,"slot-override");         *error = TRUE;         ReturnExpression(theEnv,top);         SetEvaluationError(theEnv,TRUE);         return(NULL);        }      theExp->nextArg = GenConstant(theEnv,SYMBOL,EnvTrueSymbol(theEnv));      if (CollectArguments(theEnv,theExp->nextArg,readSource) == NULL)        {         *error = TRUE;         ReturnExpression(theEnv,top);         return(NULL);        }      if (top == NULL)        top = theExp;      else        bot->nextArg = theExp;      bot = theExp->nextArg;      PPCRAndIndent(theEnv);      GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);     }   PPBackup(theEnv);   PPBackup(theEnv);   SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);   return(top);  }#endif/****************************************************************************  NAME         : ParseSimpleInstance  DESCRIPTION  : Parses instances from file for load-instances                   into an EXPRESSION forms that                   can later be evaluated with EvaluateExpression(theEnv,)  INPUTS       : 1) The address of the top node of the expression                    containing the make-instance function call                 2) The logical name of the input source  RETURNS      : The address of the modified expression, or NULL                    if there is an error  SIDE EFFECTS : The expression is enhanced to include all                    aspects of the make-instance call                    (slot-overrides etc.)                 The "top" expression is deleted on errors.  NOTES        : The name, class, values etc. must be constants.                 This function parses a make-instance call into                 an expression of the following form :                  (make-instance <instance> of <class> <slot-override>*)                  where <slot-override> ::= (<slot-name> <expression>+)                  goes to -->                  make-instance                      |                      V                  <instance-name>-><class-name>-><slot-name>-><dummy-node>...                                                                 |                                                                 V                                                          <value-expression>... ****************************************************************************/globle EXPRESSION *ParseSimpleInstance(  void *theEnv,  EXPRESSION *top,  char *readSource)  {   EXPRESSION *theExp,*vals = NULL,*vbot,*tval;   unsigned short type;   GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);   if ((GetType(DefclassData(theEnv)->ObjectParseToken) != INSTANCE_NAME) &&       (GetType(DefclassData(theEnv)->ObjectParseToken) != SYMBOL))     goto MakeInstanceError;   if ((GetType(DefclassData(theEnv)->ObjectParseToken) == SYMBOL) &&       (strcmp(CLASS_RLN,DOToString(DefclassData(theEnv)->ObjectParseToken)) == 0))     {      top->argList = GenConstant(theEnv,FCALL,                                 (void *) FindFunction(theEnv,"gensym*"));     }   else     {      top->argList = GenConstant(theEnv,INSTANCE_NAME,                                 (void *) GetValue(DefclassData(theEnv)->ObjectParseToken));      GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);      if ((GetType(DefclassData(theEnv)->ObjectParseToken) != SYMBOL) ? TRUE :          (strcmp(CLASS_RLN,DOToString(DefclassData(theEnv)->ObjectParseToken)) != 0))        goto MakeInstanceError;     }   GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);   if (GetType(DefclassData(theEnv)->ObjectParseToken) != SYMBOL)     goto MakeInstanceError;   top->argList->nextArg =        GenConstant(theEnv,SYMBOL,(void *) GetValue(DefclassData(theEnv)->ObjectParseToken));   theExp = top->argList->nextArg;   if (ReplaceClassNameWithReference(theEnv,theExp) == FALSE)     goto MakeInstanceError;   GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);   while (GetType(DefclassData(theEnv)->ObjectParseToken) == LPAREN)     {      GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);      if (GetType(DefclassData(theEnv)->ObjectParseToken) != SYMBOL)        goto SlotOverrideError;      theExp->nextArg = GenConstant(theEnv,SYMBOL,(void *) GetValue(DefclassData(theEnv)->ObjectParseToken));      theExp->nextArg->nextArg = GenConstant(theEnv,SYMBOL,EnvTrueSymbol(theEnv));      theExp = theExp->nextArg->nextArg;      GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);      vbot = NULL;      while (GetType(DefclassData(theEnv)->ObjectParseToken) != RPAREN)        {         type = GetType(DefclassData(theEnv)->ObjectParseToken);         if (type == LPAREN)           {            GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);            if ((GetType(DefclassData(theEnv)->ObjectParseToken) != SYMBOL) ? TRUE :                (strcmp(ValueToString(DefclassData(theEnv)->ObjectParseToken.value),"create$") != 0))              goto SlotOverrideError;            GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);            if (GetType(DefclassData(theEnv)->ObjectParseToken) != RPAREN)              goto SlotOverrideError;            tval = GenConstant(theEnv,FCALL,(void *) FindFunction(theEnv,"create$"));           }         else           {            if ((type != SYMBOL) && (type != STRING) &&                (type != FLOAT) && (type != INTEGER) && (type != INSTANCE_NAME))              goto SlotOverrideError;            tval = GenConstant(theEnv,type,(void *) GetValue(DefclassData(theEnv)->ObjectParseToken));           }         if (vals == NULL)           vals = tval;         else           vbot->nextArg = tval;         vbot = tval;         GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);        }      theExp->argList = vals;      GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);      vals = NULL;     }   if (GetType(DefclassData(theEnv)->ObjectParseToken) != RPAREN)     goto SlotOverrideError;   return(top);MakeInstanceError:   SyntaxErrorMessage(theEnv,"make-instance");   SetEvaluationError(theEnv,TRUE);   ReturnExpression(theEnv,top);   return(NULL);SlotOverrideError:   SyntaxErrorMessage(theEnv,"slot-override");   SetEvaluationError(theEnv,TRUE);   ReturnExpression(theEnv,top);   ReturnExpression(theEnv,vals);   return(NULL);  }/* =========================================   *****************************************          INTERNALLY VISIBLE FUNCTIONS   =========================================   ***************************************** *//***************************************************  NAME         : ReplaceClassNameWithReference  DESCRIPTION  : In parsing a make instance call,                 this function replaces a constant                 class name with an actual pointer                 to the class  INPUTS       : The expression  RETURNS      : TRUE if all OK, FALSE                 if class cannot be found  SIDE EFFECTS : The expression type and value are                 modified if class is found  NOTES        : Searches current nd imported                 modules for reference ***************************************************/static intBool ReplaceClassNameWithReference(  void *theEnv,  EXPRESSION *theExp)  {   char *theClassName;   void *theDefclass;   if (theExp->type == SYMBOL)     {      theClassName = ValueToString(theExp->value);      theDefclass = (void *) LookupDefclassInScope(theEnv,theClassName);      if (theDefclass == NULL)        {         CantFindItemErrorMessage(theEnv,"class",theClassName);         return(FALSE);        }      if (EnvClassAbstractP(theEnv,theDefclass))        {         PrintErrorID(theEnv,"INSMNGR",3,FALSE);         EnvPrintRouter(theEnv,WERROR,"Cannot create instances of abstract class ");         EnvPrintRouter(theEnv,WERROR,theClassName);         EnvPrintRouter(theEnv,WERROR,".\n");         return(FALSE);        }      theExp->type = DEFCLASS_PTR;      theExp->value = theDefclass;     }   return(TRUE);  }#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -