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

📄 dffnxpsr.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*               CLIPS Version 6.24  06/05/06          */   /*                                                     */   /*                                                     */   /*******************************************************//*************************************************************//* Purpose: Deffunction Parsing Routines                     *//*                                                           *//* Principal Programmer(s):                                  *//*      Brian L. Donnell                                     *//*                                                           *//* Contributing Programmer(s):                               *//*                                                           *//* Revision History:                                         *//*                                                           *//*      6.24: Renamed BOOLEAN macro type to intBool.         *//*                                                           *//*            If the last construct in a loaded file is a    *//*            deffunction or defmethod with no closing right *//*            parenthesis, an error should be issued, but is *//*            not. DR0872                                    *//*                                                           *//*            Added pragmas to prevent unused variable       *//*            warnings.                                      *//*                                                           *//*************************************************************//* =========================================   *****************************************               EXTERNAL DEFINITIONS   =========================================   ***************************************** */#include "setup.h"#if DEFFUNCTION_CONSTRUCT && (! BLOAD_ONLY) && (! RUN_TIME)#if BLOAD || BLOAD_AND_BSAVE#include "bload.h"#endif#if DEFRULE_CONSTRUCT#include "network.h"#endif#if DEFGENERIC_CONSTRUCT#include "genrccom.h"#endif#include "constant.h"#include "cstrcpsr.h"#include "constrct.h"#include "dffnxfun.h"#include "envrnmnt.h"#include "expressn.h"#include "exprnpsr.h"#include "extnfunc.h"#include "memalloc.h"#include "prccode.h"#include "router.h"#include "scanner.h"#include "symbol.h"#define _DFFNXPSR_SOURCE_#include "dffnxpsr.h"/* =========================================   *****************************************      INTERNALLY VISIBLE FUNCTION HEADERS   =========================================   ***************************************** */static intBool ValidDeffunctionName(void *,char *);static DEFFUNCTION *AddDeffunction(void *,SYMBOL_HN *,EXPRESSION *,int,int,int,int);/* =========================================   *****************************************          EXTERNALLY VISIBLE FUNCTIONS   =========================================   ***************************************** *//***************************************************************************  NAME         : ParseDeffunction  DESCRIPTION  : Parses the deffunction construct  INPUTS       : The input logical name  RETURNS      : FALSE if successful parse, TRUE otherwise  SIDE EFFECTS : Creates valid deffunction definition  NOTES        : H/L Syntax :                 (deffunction <name> [<comment>]                    (<single-field-varible>* [<multifield-variable>])                    <action>*) ***************************************************************************/globle intBool ParseDeffunction(  void *theEnv,  char *readSource)  {   SYMBOL_HN *deffunctionName;   EXPRESSION *actions;   EXPRESSION *parameterList;   SYMBOL_HN *wildcard;   int min,max,lvars,DeffunctionError = FALSE;   short overwrite = FALSE, owMin = 0, owMax = 0;   DEFFUNCTION *dptr;   SetPPBufferStatus(theEnv,ON);   FlushPPBuffer(theEnv);   SetIndentDepth(theEnv,3);   SavePPBuffer(theEnv,"(deffunction ");#if BLOAD || BLOAD_AND_BSAVE   if ((Bloaded(theEnv) == TRUE) && (! ConstructData(theEnv)->CheckSyntaxMode))     {      CannotLoadWithBloadMessage(theEnv,"deffunctions");      return(TRUE);     }#endif   /* =====================================================      Parse the name and comment fields of the deffunction.      ===================================================== */   deffunctionName = GetConstructNameAndComment(theEnv,readSource,&DeffunctionData(theEnv)->DFInputToken,"deffunction",                                                EnvFindDeffunction,NULL,                                                "!",TRUE,TRUE,TRUE);   if (deffunctionName == NULL)     return(TRUE);   if (ValidDeffunctionName(theEnv,ValueToString(deffunctionName)) == FALSE)     return(TRUE);   /*==========================*/   /* Parse the argument list. */   /*==========================*/   parameterList = ParseProcParameters(theEnv,readSource,&DeffunctionData(theEnv)->DFInputToken,NULL,&wildcard,                                       &min,&max,&DeffunctionError,NULL);   if (DeffunctionError)     return(TRUE);   /*===================================================================*/   /* Go ahead and add the deffunction so it can be recursively called. */   /*===================================================================*/   if (ConstructData(theEnv)->CheckSyntaxMode)     {      dptr = (DEFFUNCTION *) EnvFindDeffunction(theEnv,ValueToString(deffunctionName));      if (dptr == NULL)        { dptr = AddDeffunction(theEnv,deffunctionName,NULL,min,max,0,TRUE); }      else        {         overwrite = TRUE;         owMin = (short) dptr->minNumberOfParameters;         owMax = (short) dptr->maxNumberOfParameters;         dptr->minNumberOfParameters = min;         dptr->maxNumberOfParameters = max;        }     }   else     { dptr = AddDeffunction(theEnv,deffunctionName,NULL,min,max,0,TRUE); }   if (dptr == NULL)     {      ReturnExpression(theEnv,parameterList);      return(TRUE);     }   /*==================================================*/   /* Parse the actions contained within the function. */   /*==================================================*/   PPCRAndIndent(theEnv);   ExpressionData(theEnv)->ReturnContext = TRUE;   actions = ParseProcActions(theEnv,"deffunction",readSource,                              &DeffunctionData(theEnv)->DFInputToken,parameterList,wildcard,                              NULL,NULL,&lvars,NULL);   /*=============================================================*/   /* Check for the closing right parenthesis of the deffunction. */   /*=============================================================*/   if ((DeffunctionData(theEnv)->DFInputToken.type != RPAREN) && /* DR0872 */       (actions != NULL))     {      SyntaxErrorMessage(theEnv,"deffunction");            ReturnExpression(theEnv,parameterList);      ReturnPackedExpression(theEnv,actions);      if (overwrite)        {         dptr->minNumberOfParameters = owMin;         dptr->maxNumberOfParameters = owMax;        }      if ((dptr->busy == 0) && (! overwrite))        {         RemoveConstructFromModule(theEnv,(struct constructHeader *) dptr);         RemoveDeffunction(theEnv,dptr);        }      return(TRUE);     }   if (actions == NULL)     {      ReturnExpression(theEnv,parameterList);      if (overwrite)        {         dptr->minNumberOfParameters = owMin;         dptr->maxNumberOfParameters = owMax;        }      if ((dptr->busy == 0) && (! overwrite))        {         RemoveConstructFromModule(theEnv,(struct constructHeader *) dptr);         RemoveDeffunction(theEnv,dptr);        }      return(TRUE);     }   /*==============================================*/   /* If we're only checking syntax, don't add the */   /* successfully parsed deffunction to the KB.   */   /*==============================================*/   if (ConstructData(theEnv)->CheckSyntaxMode)     {      ReturnExpression(theEnv,parameterList);      ReturnPackedExpression(theEnv,actions);      if (overwrite)        {         dptr->minNumberOfParameters = owMin;         dptr->maxNumberOfParameters = owMax;        }      else        {         RemoveConstructFromModule(theEnv,(struct constructHeader *) dptr);         RemoveDeffunction(theEnv,dptr);

⌨️ 快捷键说明

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