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

📄 inspsr.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*              CLIPS Version 6.24  06/05/06           */   /*                                                     */   /*                INSTANCE PARSER MODULE               */   /*******************************************************//*************************************************************//* Purpose:  Instance Function Parsing Routines              *//*                                                           *//* Principal Programmer(s):                                  *//*      Brian L. Donnell                                     *//*                                                           *//* Contributing Programmer(s):                               *//*                                                           *//* Revision History:                                         *//*      6.23: Correction for FalseSymbol/TrueSymbol. DR0859  *//*                                                           *//*            Changed name of variable exp to theExp         *//*            because of Unix compiler warnings of shadowed  *//*            definitions.                                   *//*                                                           *//*      6.24: Renamed BOOLEAN macro type to intBool.         *//*                                                           *//*************************************************************//* =========================================   *****************************************               EXTERNAL DEFINITIONS   =========================================   ***************************************** */#include "setup.h"#if OBJECT_SYSTEM#ifndef _STDIO_INCLUDED_#define _STDIO_INCLUDED_#include <stdio.h>#endif#include <string.h>#include "classcom.h"#include "classfun.h"#include "classinf.h"#include "constant.h"#include "envrnmnt.h"#include "evaluatn.h"#include "exprnpsr.h"#include "extnfunc.h"#include "moduldef.h"#include "prntutil.h"#include "router.h"#define _INSPSR_SOURCE_#include "inspsr.h"/* =========================================   *****************************************                   CONSTANTS   =========================================   ***************************************** */#define MAKE_TYPE       0#define INITIALIZE_TYPE 1#define MODIFY_TYPE     2#define DUPLICATE_TYPE  3#define CLASS_RLN          "of"#define DUPLICATE_NAME_REF "to"/* =========================================   *****************************************      INTERNALLY VISIBLE FUNCTION HEADERS   =========================================   ***************************************** */static intBool ReplaceClassNameWithReference(void *,EXPRESSION *);/* =========================================   *****************************************          EXTERNALLY VISIBLE FUNCTIONS   =========================================   ***************************************** */#if ! RUN_TIME/*************************************************************************************  NAME         : ParseInitializeInstance  DESCRIPTION  : Parses initialize-instance and make-instance function                   calls into an EXPRESSION form that                   can later be evaluated with EvaluateExpression(theEnv,)  INPUTS       : 1) The address of the top node of the expression                    containing the initialize-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 initialize-instance call                    (slot-overrides etc.)                 The "top" expression is deleted on errors.  NOTES        : This function parses a initialize-instance call into                 an expression of the following form :                 (initialize-instance <instance-name> <slot-override>*)                  where <slot-override> ::= (<slot-name> <expression>+)                  goes to -->                  initialize-instance                      |                      V                  <instance or name>-><slot-name>-><dummy-node>...                                                      |                                                      V                                               <value-expression>...                  (make-instance <instance> of <class> <slot-override>*)                  goes to -->                  make-instance                      |                      V                  <instance-name>-><class-name>-><slot-name>-><dummy-node>...                                                                 |                                                                 V                                                          <value-expression>...                  (make-instance of <class> <slot-override>*)                  goes to -->                  make-instance                      |                      V                  (gensym*)-><class-name>-><slot-name>-><dummy-node>...                                                                 |                                                                 V                                                          <value-expression>...                  (modify-instance <instance> <slot-override>*)                  goes to -->                  modify-instance                      |                      V                  <instance or name>-><slot-name>-><dummy-node>...                                                      |                                                      V                                               <value-expression>...                  (duplicate-instance <instance> [to <new-name>] <slot-override>*)                  goes to -->                  duplicate-instance                      |                      V                  <instance or name>-><new-name>-><slot-name>-><dummy-node>...                                          OR                         |                                      (gensym*)                      V                                                           <value-expression>... *************************************************************************************/globle EXPRESSION *ParseInitializeInstance(  void *theEnv,  EXPRESSION *top,  char *readSource)  {   int error,fcalltype,readclass;   if ((top->value == (void *) FindFunction(theEnv,"make-instance")) ||       (top->value == (void *) FindFunction(theEnv,"active-make-instance")))     fcalltype = MAKE_TYPE;   else if ((top->value == (void *) FindFunction(theEnv,"initialize-instance")) ||            (top->value == (void *) FindFunction(theEnv,"active-initialize-instance")))     fcalltype = INITIALIZE_TYPE;   else if ((top->value == (void *) FindFunction(theEnv,"modify-instance")) ||            (top->value == (void *) FindFunction(theEnv,"active-modify-instance")) ||            (top->value == (void *) FindFunction(theEnv,"message-modify-instance")) ||            (top->value == (void *) FindFunction(theEnv,"active-message-modify-instance")))     fcalltype = MODIFY_TYPE;   else     fcalltype = DUPLICATE_TYPE;   IncrementIndentDepth(theEnv,3);   error = FALSE;   if (top->type == UNKNOWN_VALUE)     top->type = FCALL;   else     SavePPBuffer(theEnv," ");   top->argList = ArgumentParse(theEnv,readSource,&error);   if (error)     goto ParseInitializeInstanceError;   else if (top->argList == NULL)     {      SyntaxErrorMessage(theEnv,"instance");      goto ParseInitializeInstanceError;     }   SavePPBuffer(theEnv," ");   if (fcalltype == MAKE_TYPE)     {      /* ======================================         Handle the case of anonymous instances         where the name was not specified         ====================================== */      if ((top->argList->type != SYMBOL) ? FALSE :          (strcmp(ValueToString(top->argList->value),CLASS_RLN) == 0))        {         top->argList->nextArg = ArgumentParse(theEnv,readSource,&error);         if (error == TRUE)           goto ParseInitializeInstanceError;         if (top->argList->nextArg == NULL)           {            SyntaxErrorMessage(theEnv,"instance class");            goto ParseInitializeInstanceError;           }         if ((top->argList->nextArg->type != SYMBOL) ? TRUE :             (strcmp(ValueToString(top->argList->nextArg->value),CLASS_RLN) != 0))           {            top->argList->type = FCALL;            top->argList->value = (void *) FindFunction(theEnv,"gensym*");            readclass = FALSE;           }         else           readclass = TRUE;        }      else        {         GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);         if ((GetType(DefclassData(theEnv)->ObjectParseToken) != SYMBOL) ? TRUE :             (strcmp(CLASS_RLN,DOToString(DefclassData(theEnv)->ObjectParseToken)) != 0))           {            SyntaxErrorMessage(theEnv,"make-instance");            goto ParseInitializeInstanceError;           }         SavePPBuffer(theEnv," ");         readclass = TRUE;        }      if (readclass)        {         top->argList->nextArg = ArgumentParse(theEnv,readSource,&error);         if (error)           goto ParseInitializeInstanceError;         if (top->argList->nextArg == NULL)           {            SyntaxErrorMessage(theEnv,"instance class");            goto ParseInitializeInstanceError;           }        }      /* ==============================================         If the class name is a constant, go ahead and         look it up now and replace it with the pointer         ============================================== */      if (ReplaceClassNameWithReference(theEnv,top->argList->nextArg) == FALSE)        goto ParseInitializeInstanceError;      PPCRAndIndent(theEnv);      GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);      top->argList->nextArg->nextArg =                  ParseSlotOverrides(theEnv,readSource,&error);     }   else     {      PPCRAndIndent(theEnv);      GetToken(theEnv,readSource,&DefclassData(theEnv)->ObjectParseToken);      if (fcalltype == DUPLICATE_TYPE)        {         if ((DefclassData(theEnv)->ObjectParseToken.type != SYMBOL) ? FALSE :             (strcmp(DOToString(DefclassData(theEnv)->ObjectParseToken),DUPLICATE_NAME_REF) == 0))           {            PPBackup(theEnv);            PPBackup(theEnv);            SavePPBuffer(theEnv,DefclassData(theEnv)->ObjectParseToken.printForm);            SavePPBuffer(theEnv," ");            top->argList->nextArg = ArgumentParse(theEnv,readSource,&error);            if (error)              goto ParseInitializeInstanceError;            if (top->argList->nextArg == NULL)              {               SyntaxErrorMessage(theEnv,"instance name");               goto ParseInitializeInstanceError;

⌨️ 快捷键说明

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