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

📄 globlpsr.c

📁 NASA 开发使用的一个专家系统
💻 C
📖 第 1 页 / 共 2 页
字号:
   /* Check for import/export conflicts from the construct definition. */   /*==================================================================*/     #if DEFMODULE_CONSTRUCT   if (FindImportExportConflict("defglobal",((struct defmodule *) GetCurrentModule()),ValueToString(variableName)))     {      ImportExportConflictMessage("defglobal",ValueToString(variableName),NULL,NULL);      *defglobalError = CLIPS_TRUE;      return(CLIPS_FALSE);     }#endif   /*==============================*/   /* The next token must be an =. */   /*==============================*/   GetToken(readSource,theToken);   if (strcmp(theToken->printForm,"=") != 0)     {      SyntaxErrorMessage("defglobal");      *defglobalError = CLIPS_TRUE;      return(CLIPS_FALSE);     }   SavePPBuffer(" ");   /*======================================================*/   /* Parse the expression to be assigned to the variable. */   /*======================================================*/   assignPtr = ParseAtomOrExpression(readSource,NULL);   if (assignPtr == NULL)     {      *defglobalError = CLIPS_TRUE;      return(CLIPS_FALSE);     }   /*==========================*/   /* Evaluate the expression. */   /*==========================*/   SetEvaluationError(CLIPS_FALSE);   if (EvaluateExpression(assignPtr,&assignValue))     {      ReturnExpression(assignPtr);      *defglobalError = CLIPS_TRUE;      return(CLIPS_FALSE);     }   SavePPBuffer(")");      /*======================================*/   /* Add the variable to the global list. */   /*======================================*/   AddDefglobal(variableName,&assignValue,assignPtr);      /*==================================================*/   /* Return TRUE to indicate that the global variable */   /* definition was successfully parsed.              */   /*==================================================*/      return(CLIPS_TRUE);  }/*********************************************************//* AddDefglobal: Adds a defglobal to the current module. *//*********************************************************/static VOID AddDefglobal(name,vPtr,ePtr)  SYMBOL_HN *name;  DATA_OBJECT_PTR vPtr;  struct expr *ePtr;  {   struct defglobal *defglobalPtr;   BOOLEAN new = CLIPS_FALSE;#if DEBUGGING_FUNCTIONS   int GlobalHadWatch = CLIPS_FALSE;#endif   /*========================================================*/   /* If the defglobal is already defined, then use the old  */   /* data structure and substitute new values. If it hasn't */   /* been defined, then create a new data structure.        */   /*========================================================*/   defglobalPtr = QFindDefglobal(name);   if (defglobalPtr == NULL)     {      new = CLIPS_TRUE;      defglobalPtr = get_struct(defglobal);     }   else     {      DeinstallConstructHeader(&defglobalPtr->header);#if DEBUGGING_FUNCTIONS      GlobalHadWatch = defglobalPtr->watch;#endif     }   /*===========================================*/   /* Remove the old values from the defglobal. */   /*===========================================*/   if (new == CLIPS_FALSE)     {      ValueDeinstall(&defglobalPtr->current);      if (defglobalPtr->current.type == MULTIFIELD)        { ReturnMultifield(defglobalPtr->current.value); }            RemoveHashedExpression(defglobalPtr->initial);     }   /*=======================================*/   /* Copy the new values to the defglobal. */   /*=======================================*/   defglobalPtr->current.type = vPtr->type;   if (vPtr->type != MULTIFIELD) defglobalPtr->current.value = vPtr->value;   else DuplicateMultifield(&defglobalPtr->current,vPtr);   ValueInstall(&defglobalPtr->current);   defglobalPtr->initial = AddHashedExpression(ePtr);   ReturnExpression(ePtr);   ChangeToGlobals = CLIPS_TRUE;   /*=================================*/   /* Restore the old watch value to  */   /* the defglobal if redefined.     */   /*=================================*/   #if DEBUGGING_FUNCTIONS   defglobalPtr->watch = GlobalHadWatch ? CLIPS_TRUE : WatchGlobals;#endif   /*======================================*/   /* Save the name and pretty print form. */   /*======================================*/      defglobalPtr->header.name = name;   IncrementSymbolCount(name);   SavePPBuffer("\n");   if (GetConserveMemory() == CLIPS_TRUE)     { defglobalPtr->header.ppForm = NULL; }   else     { defglobalPtr->header.ppForm = CopyPPBuffer(); }        defglobalPtr->inScope = CLIPS_TRUE;   /*=============================================*/   /* If the defglobal was redefined, we're done. */   /*=============================================*/   if (new == CLIPS_FALSE) return;   /*===================================*/   /* Copy the defglobal variable name. */   /*===================================*/   defglobalPtr->busyCount = 0;   defglobalPtr->header.whichModule = (struct defmoduleItemHeader *)                               GetModuleItem(NULL,FindModuleItem("defglobal")->moduleIndex);   /*=============================================*/   /* Add the defglobal to the list of defglobals */   /* for the current module.                     */   /*=============================================*/         AddConstructToModule(&defglobalPtr->header);  }  /*****************************************************************//* ReplaceGlobalVariable: Replaces a global variable found in an *//*   expression with the appropriate primitive data type which   *//*   can later be used to retrieve the global variable's value.  *//*****************************************************************/globle BOOLEAN ReplaceGlobalVariable(ePtr)  struct expr *ePtr;  {   struct defglobal *theGlobal;   int count;      /*=================================*/   /* Search for the global variable. */   /*=================================*/      theGlobal = (struct defglobal *)                FindImportedConstruct("defglobal",NULL,ValueToString(ePtr->value),                                     &count,CLIPS_TRUE,NULL);                  /*=============================================*/   /* If it wasn't found, print an error message. */   /*=============================================*/      if (theGlobal == NULL)     {      GlobalReferenceErrorMessage(ValueToString(ePtr->value));      return(CLIPS_FALSE);     }        /*========================================================*/   /* The current implementation of the defmodules shouldn't */   /* allow a construct to be defined which would cause an   */   /* ambiguous reference, but we'll check for it anyway.    */   /*========================================================*/      if (count > 1)      {      AmbiguousReferenceErrorMessage("defglobal",ValueToString(ePtr->value));      return(CLIPS_FALSE);     }   /*==============================================*/   /* Replace the symbolic reference of the global */   /* variable with a direct pointer reference.    */   /*==============================================*/      ePtr->type = DEFGLOBAL_PTR;   ePtr->value = (VOID *) theGlobal;   return(CLIPS_TRUE);  }/*****************************************************************//* GlobalReferenceErrorMessage: Prints an error message when a   *//*   symbolic reference to a global variable cannot be resolved. *//*****************************************************************/globle VOID GlobalReferenceErrorMessage(variableName)  char *variableName;  {   PrintErrorID("GLOBLPSR",1,CLIPS_TRUE);   PrintCLIPS(WERROR,"\nGlobal variable ?*");   PrintCLIPS(WERROR,variableName);   PrintCLIPS(WERROR,"* was referenced, but is not defined.\n");  }  #endif /* (! RUN_TIME) && (! BLOAD_ONLY) */#endif /* DEFGLOBAL_CONSTRUCT */

⌨️ 快捷键说明

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