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

📄 factcmp.c

📁 NASA 开发使用的一个专家系统
💻 C
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*             CLIPS Version 6.05  04/09/97            */   /*                                                     */   /*     FACT PATTERN NETWORK CONSTRUCTS-TO-C MODULE     */   /*******************************************************//*************************************************************//* Purpose: Implements the constructs-to-c feature for the   *//*    fact pattern network.                                  *//*                                                           *//* Principal Programmer(s):                                  *//*      Gary D. Riley                                        *//*                                                           *//* Contributing Programmer(s):                               *//*                                                           *//* Revision History:                                         *//*                                                           *//*************************************************************/#define _FACTCMP_SOURCE_#include "setup.h"#if DEFRULE_CONSTRUCT && (! RUN_TIME) && DEFTEMPLATE_CONSTRUCT && CONSTRUCT_COMPILER#define FactPrefix() ArbitraryPrefix(FactCodeItem,0)#include <stdio.h>#define _CLIPS_STDIO_#include "factbld.h" #include "conscomp.h"#include "factcmp.h"#include "tmpltdef.h"/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/#if ANSI_COMPILER   static int                     PatternNetworkToCode(char *,int,FILE *,int,int);   static VOID                    BeforePatternNetworkToCode(VOID);   static struct factPatternNode *GetNextPatternNode(struct factPatternNode *);   static VOID                    CloseNetworkFiles(FILE *,int);     static VOID                    PatternNodeToCode(FILE *,struct factPatternNode *,int,int);#else   static int                     PatternNetworkToCode();   static VOID                    BeforePatternNetworkToCode();   static struct factPatternNode *GetNextPatternNode();   static VOID                    CloseNetworkFiles();     static VOID                    PatternNodeToCode();#endif/***************************************//* LOCAL INTERNAL VARIABLE DEFINITIONS *//***************************************/   static struct CodeGeneratorItem *FactCodeItem;/**************************************************************//* FactPatternsCompilerSetup: Initializes the constructs-to-c *//*   command for use with the fact pattern network.           *//**************************************************************/globle VOID FactPatternsCompilerSetup()  {   FactCodeItem = AddCodeGeneratorItem("facts",0,BeforePatternNetworkToCode,                                       NULL,PatternNetworkToCode,1);  }/****************************************************************//* BeforePatternNetworkToCode: Assigns each pattern node with a *//*   unique ID which will be used for pointer references when   *//*   the data structures are written to a file as C code        *//****************************************************************/ static VOID BeforePatternNetworkToCode()  {   int whichPattern = 0;   int whichDeftemplate = 0;   struct defmodule *theModule;   struct deftemplate *theDeftemplate;   struct factPatternNode *thePattern;      /*===========================*/   /* Loop through each module. */   /*===========================*/      for (theModule = (struct defmodule *) GetNextDefmodule(NULL);        theModule != NULL;        theModule = (struct defmodule *) GetNextDefmodule(theModule))     {      /*=========================*/      /* Set the current module. */      /*=========================*/            SetCurrentModule((VOID *) theModule);            /*======================================================*/      /* Loop through each deftemplate in the current module. */      /*======================================================*/            for (theDeftemplate = (struct deftemplate *) GetNextDeftemplate(NULL);           theDeftemplate != NULL;           theDeftemplate = (struct deftemplate *) GetNextDeftemplate(theDeftemplate))        {         /*=================================================*/         /* Assign each pattern node in the pattern network */         /* for the deftemplate a unique integer ID.        */         /*=================================================*/                  theDeftemplate->header.bsaveID = whichDeftemplate++;         for (thePattern = theDeftemplate->patternNetwork;              thePattern != NULL;              thePattern = GetNextPatternNode(thePattern))           { thePattern->bsaveID = whichPattern++; }        }     }  }/********************************************************************//* GetNextPatternNode: Returns the next node in a pattern network   *//*   tree. The next node is computed using a depth first traversal. *//********************************************************************/static struct factPatternNode *GetNextPatternNode(thePattern)  struct factPatternNode *thePattern;  {   /*=========================================*/   /* If it's possible to go deeper into the  */   /* tree, then move down to the next level. */   /*=========================================*/      if (thePattern->nextLevel != NULL) return(thePattern->nextLevel);           /*========================================*/   /* Keep backing up toward the root of the */   /* tree until a side branch can be taken. */   /*========================================*/      while (thePattern->rightNode == NULL)     {      /*========================================*/      /* Back up to check the next side branch. */      /*========================================*/            thePattern = thePattern->lastLevel;            /*======================================*/      /* If we branched up from the root, the */      /* entire tree has been traversed.      */      /*======================================*/            if (thePattern == NULL) return(NULL);     }        /*==================================*/   /* Move on to the next side branch. */   /*==================================*/      return(thePattern->rightNode);  }  /********************************************************************//* PatternNetworkToCode: Produces the fact pattern network code for *//*   a run-time module created using the constructs-to-c function.  *//********************************************************************/static int PatternNetworkToCode(fileName,fileID,headerFP,imageID,maxIndices)  char *fileName;  int fileID;  FILE *headerFP;  int imageID;  int maxIndices;  {   int fileCount = 1;   struct defmodule *theModule;   struct deftemplate *theTemplate;   struct factPatternNode *thePatternNode;   int networkArrayCount = 0, networkArrayVersion = 1;   FILE *networkFile = NULL;   /*===========================================================*/   /* Include the appropriate fact pattern network header file. */   /*===========================================================*/      fprintf(headerFP,"#include \"factbld.h\"\n");         /*===============================*/   /* Loop through all the modules. */   /*===============================*/      for (theModule = (struct defmodule *) GetNextDefmodule(NULL);        theModule != NULL;        theModule = (struct defmodule *) GetNextDefmodule(theModule))     {           /*=========================*/      /* Set the current module. */      /*=========================*/                  SetCurrentModule((VOID *) theModule);      /*======================================*/      /* Loop through all of the deftemplates */      /* in the current module.               */      /*======================================*/            for (theTemplate = (struct deftemplate *) GetNextDeftemplate(NULL);           theTemplate != NULL;           theTemplate = (struct deftemplate *) GetNextDeftemplate(theTemplate))        {         /*======================================================*/         /* Loop through each pattern node in the deftemplate's  */         /* pattern network writing its C code representation to */         /* the file as it is traversed.                         */         /*======================================================*/                  for (thePatternNode = theTemplate->patternNetwork;              thePatternNode != NULL;              thePatternNode = GetNextPatternNode(thePatternNode))           {            networkFile = OpenFileIfNeeded(networkFile,fileName,fileID,imageID,&fileCount,                                         networkArrayVersion,headerFP,                                         "struct factPatternNode",FactPrefix(),CLIPS_FALSE,NULL);            if (networkFile == NULL)              {               CloseNetworkFiles(networkFile,maxIndices);               return(0);              }                       PatternNodeToCode(networkFile,thePatternNode,imageID,maxIndices);            networkArrayCount++;            networkFile = CloseFileIfNeeded(networkFile,&networkArrayCount,                                            &networkArrayVersion,maxIndices,NULL,NULL);           }                  }     }      /*==============================*/        /* Close any C files left open. */   /*==============================*/      CloseNetworkFiles(networkFile,maxIndices);       /*===============================*/   /* Return TRUE to indicate the C */   /* code was successfully saved.  */    /*===============================*/      return(CLIPS_TRUE);  }  /****************************************************************//* CloseNetworkFiles: Closes all of the C files created for the *//*   fact pattern network. Called when an error occurs or when  *//*   the fact pattern network data structures have all been     *//*   written to the files.                                      *//****************************************************************/static VOID CloseNetworkFiles(networkFile,maxIndices)  FILE *networkFile;   int maxIndices;    {   int count = maxIndices;   int arrayVersion = 0;      if (networkFile != NULL)      {      CloseFileIfNeeded(networkFile,&count,&arrayVersion,maxIndices,NULL,NULL);     }  }  /************************************************************//* PatternNodeToCode: Writes the C code representation of a *//*   single fact pattern node slot to the specified file.   *//************************************************************/static VOID PatternNodeToCode(theFile,thePatternNode,imageID,maxIndices)  FILE *theFile;  struct factPatternNode *thePatternNode;  int imageID;  int maxIndices;  {   fprintf(theFile,"{");         /*=====================*/   /* Pattern Node Header */   /*=====================*/   PatternNodeHeaderToCode(theFile,&thePatternNode->header,imageID,maxIndices);   /*========================*/   /* Field and Slot Indices */   /*========================*/      fprintf(theFile,",0,%d,%d,%d,",thePatternNode->whichField,                             thePatternNode->whichSlot,                             thePatternNode->leaveFields);         /*===============*/   /* Network Tests */   /*===============*/   PrintHashedExpressionReference(theFile,thePatternNode->networkTest,imageID,maxIndices);   /*============*/   /* Next Level */   /*============*/   if (thePatternNode->nextLevel == NULL)     { fprintf(theFile,",NULL,"); }   else     {      fprintf(theFile,",&%s%d_%ld[%ld],",FactPrefix(),                 imageID,(thePatternNode->nextLevel->bsaveID / maxIndices) + 1,                         thePatternNode->nextLevel->bsaveID % maxIndices);     }   /*============*/   /* Last Level */   /*============*/   if (thePatternNode->lastLevel == NULL)     { fprintf(theFile,"NULL,"); }   else     {      fprintf(theFile,"&%s%d_%ld[%ld],",FactPrefix(),              imageID,(thePatternNode->lastLevel->bsaveID / maxIndices) + 1,                   thePatternNode->lastLevel->bsaveID % maxIndices);     }   /*===========*/   /* Left Node */   /*===========*/   if (thePatternNode->leftNode == NULL)     { fprintf(theFile,"NULL,"); }   else     {      fprintf(theFile,"&%s%d_%ld[%ld],",FactPrefix(),             imageID,(thePatternNode->leftNode->bsaveID / maxIndices) + 1,                  thePatternNode->leftNode->bsaveID % maxIndices);     }   /*============*/   /* Right Node */   /*============*/      if (thePatternNode->rightNode == NULL)     { fprintf(theFile,"NULL}"); }   else     {      fprintf(theFile,"&%s%d_%ld[%ld]}",FactPrefix(),            imageID,(thePatternNode->rightNode->bsaveID / maxIndices) + 1,                thePatternNode->rightNode->bsaveID % maxIndices);     }  } /**********************************************************//* FactPatternNodeReference: Prints C code representation *//*   of a fact pattern node data structure reference.     *//**********************************************************/globle VOID FactPatternNodeReference(theVPattern,theFile,imageID,maxIndices)  VOID *theVPattern;  FILE *theFile;  int imageID;  int maxIndices;  {   struct factPatternNode *thePattern = (struct factPatternNode *) theVPattern;      if (thePattern == NULL) fprintf(theFile,"NULL");   else     {      fprintf(theFile,"&%s%d_%ld[%ld]",FactPrefix(),                    imageID,(thePattern->bsaveID / maxIndices) + 1,                            thePattern->bsaveID % maxIndices);     }  }                            #endif /* DEFRULE_CONSTRUCT && (! RUN_TIME) && DEFTEMPLATE_CONSTRUCT && CONSTRUCT_COMPILER */

⌨️ 快捷键说明

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