📄 globlpsr.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.05 04/09/97 */ /* */ /* DEFGLOBAL PARSER MODULE */ /*******************************************************//*************************************************************//* Purpose: Parses the defglobal construct. *//* *//* Principal Programmer(s): *//* Gary D. Riley *//* *//* Contributing Programmer(s): *//* Brian L. Donnell *//* *//* Revision History: *//* *//*************************************************************/#define _GLOBLPSR_SOURCE_#include "setup.h"#if DEFGLOBAL_CONSTRUCT#include <string.h>#include "pprint.h"#include "router.h"#include "clipsmem.h"#include "scanner.h"#include "evaluatn.h"#include "exprnpsr.h"#include "constrct.h"#include "multifld.h"#include "watch.h"#include "modulutl.h"#include "modulpsr.h"#include "cstrcpsr.h"#include "globldef.h"#include "globlbsc.h"#if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE#include "bload.h"#endif#include "globlpsr.h"/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/#if (! RUN_TIME) && (! BLOAD_ONLY)#if ANSI_COMPILER static BOOLEAN GetVariableDefinition(char *,int *,int,struct token *); static VOID AddDefglobal(SYMBOL_HN *,DATA_OBJECT_PTR,struct expr *);#else static BOOLEAN GetVariableDefinition(); static VOID AddDefglobal();#endif#endif/*********************************************************************//* ParseDefglobal: Coordinates all actions necessary for the parsing *//* and creation of a defglobal into the current environment. *//*********************************************************************/globle BOOLEAN ParseDefglobal(readSource) char *readSource; { int defglobalError = CLIPS_FALSE;#if (MAC_MPW || MAC_MCW) && (RUN_TIME || BLOAD_ONLY)#pragma unused(readSource)#endif #if (! RUN_TIME) && (! BLOAD_ONLY) struct token theToken; int tokenRead = CLIPS_TRUE; struct defmodule *theModule; /*=====================================*/ /* Pretty print buffer initialization. */ /*=====================================*/ SetPPBufferStatus(ON); FlushPPBuffer(); SetIndentDepth(3); SavePPBuffer("(defglobal "); /*=================================================*/ /* Individual defglobal constructs can't be parsed */ /* while a binary load is in effect. */ /*=================================================*/ #if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE if (Bloaded() == CLIPS_TRUE) { CannotLoadWithBloadMessage("defglobal"); return(CLIPS_TRUE); }#endif /*===========================*/ /* Look for the module name. */ /*===========================*/ GetToken(readSource,&theToken); if (theToken.type == SYMBOL) { /*=================================================*/ /* The optional module name can't contain a module */ /* separator like other constructs. For example, */ /* (defrule X::foo is OK for rules, but the right */ /* syntax for defglobals is (defglobal X ?*foo*. */ /*=================================================*/ tokenRead = CLIPS_FALSE; if (FindModuleSeparator(ValueToString(theToken.value))) { SyntaxErrorMessage("defglobal"); return(CLIPS_TRUE); } /*=================================*/ /* Determine if the module exists. */ /*=================================*/ theModule = (struct defmodule *) FindDefmodule(ValueToString(theToken.value)); if (theModule == NULL) { CantFindItemErrorMessage("defmodule",ValueToString(theToken.value)); return(CLIPS_TRUE); } /*=========================================*/ /* If the module name was OK, then set the */ /* current module to the specified module. */ /*=========================================*/ SavePPBuffer(" "); SetCurrentModule((VOID *) theModule); } /*===========================================*/ /* If the module name wasn't specified, then */ /* use the current module's name in the */ /* defglobal's pretty print representation. */ /*===========================================*/ else { PPBackup(); SavePPBuffer(GetDefmoduleName(((struct defmodule *) GetCurrentModule()))); SavePPBuffer(" "); SavePPBuffer(theToken.printForm); } /*======================*/ /* Parse the variables. */ /*======================*/ while (GetVariableDefinition(readSource,&defglobalError,tokenRead,&theToken)) { tokenRead = CLIPS_FALSE; FlushPPBuffer(); SavePPBuffer("(defglobal "); SavePPBuffer(GetDefmoduleName(((struct defmodule *) GetCurrentModule()))); SavePPBuffer(" "); }#endif /*==================================*/ /* Return the parsing error status. */ /*==================================*/ return(defglobalError); }#if (! RUN_TIME) && (! BLOAD_ONLY)/***************************************************************//* GetVariableDefinition: Parses and evaluates a single global *//* variable in a defglobal construct. Returns TRUE if the *//* variable was successfully parsed and FALSE if a right *//* parenthesis is encountered (signifying the end of the *//* defglobal construct) or an error occurs. The error status *//* flag is also set if an error occurs. *//***************************************************************/static BOOLEAN GetVariableDefinition(readSource,defglobalError,tokenRead,theToken) char *readSource; int *defglobalError; int tokenRead; struct token *theToken; { SYMBOL_HN *variableName; struct expr *assignPtr; DATA_OBJECT assignValue; /*========================================*/ /* Get next token, which should either be */ /* a closing parenthesis or a variable. */ /*========================================*/ if (! tokenRead) GetToken(readSource,theToken); if (theToken->type == RPAREN) return(CLIPS_FALSE); if (theToken->type == SF_VARIABLE) { SyntaxErrorMessage("defglobal"); *defglobalError = CLIPS_TRUE; return(CLIPS_FALSE); } else if (theToken->type != GBL_VARIABLE) { SyntaxErrorMessage("defglobal"); *defglobalError = CLIPS_TRUE; return(CLIPS_FALSE); } variableName = (SYMBOL_HN *) theToken->value; SavePPBuffer(" "); /*================================*/ /* Print out compilation message. */ /*================================*/#if DEBUGGING_FUNCTIONS if ((GetWatchItem("compilations") == ON) && GetPrintWhileLoading()) { if (QFindDefglobal(variableName) != NULL) PrintCLIPS(WDIALOG,"Redefining defglobal: ?"); else PrintCLIPS(WDIALOG,"Defining defglobal: "); PrintCLIPS(WDIALOG,ValueToString(variableName)); PrintCLIPS(WDIALOG,"\n"); } else #endif { if (GetPrintWhileLoading()) PrintCLIPS(WDIALOG,":"); } /*==================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -