www.pudn.com > 12cocorc.zip > CRT.H


#ifndef CRT_MODULE 
#define CRT_MODULE 
#include "collect.h" 
#include "set.h" 
#include  
 
#if Debug 
#define CR_ASSERT(cond) \ 
if( !(cond) )\ 
{fprintf(stderr, "assertion error line %d, file(%s)\n", \ 
__LINE__, __FILE__); gets(NULL); exit(1); } 
#else 
#define CR_ASSERT(cond) ; 
#endif 
 
typedef unsigned char byte; 
#define MAX_ID_LEN   32 
#define MAX_STR_LEN  100 
 
struct SemText{ 
  long pos; 
  int  line,len, col; 
}; 
 
typedef char     Name[MAX_ID_LEN]; 
typedef char     *PName; 
 
#define EOFSYM   0       /* EOF Symbol */ 
/*#define NOSYM    0*/ 
 
#define TRUE  1          /* Boolean True */ 
#define FALSE 0          /* Boolean False */ 
#define UNDEF -1 
 
#define T_CLASSTOKEN    1 
#define T_CLASSLITTOKEN 2 
#define T_LITTOKEN      3 
#define T_PRAGMATOKEN   4 
 
/****************************************************************** 
     Graph Node Constants, Definitions and Functions 
********************************************************************/ 
 
#define NIL       0 
#define T_NONE    0 
#define T_T       1      /* terminal */ 
#define T_WT      2      /* weak terminal */ 
#define T_NT      3      /* no terminal */ 
#define T_OPT     4      /* optional */ 
#define T_REP     5      /* repetition */ 
#define T_ALT     6      /* alternation */ 
#define T_SEM     7      /* semantic action */ 
#define T_ATTR    8      /* attribute */ 
#define T_ANY     9      /* ANY symbol */ 
#define T_SYNC   10      /* SYNC */ 
#define T_P      11      /* Pragma */ 
 
#define T_CHAR    T_T    /* Simple Char */ 
#define T_CLASS   T_WT   /* Char Set */ 
#define T_CONTEXT T_T    /* Context Trans */ 
#define T_NORMAL  T_NONE /* Normal Trans */ 
 
typedef struct { 
  int   type;            /* node's type */ 
  int   next;            /* next node  0 -> none, < 0 follow link */ 
  long  pointer1;        /* auxiliary pointer, see use below */				/*kws*/ 
  int   pointer2; 
  int   pointer3; 
  int   pointer4; 
  int   SLine; 
} GraphNode; 
 
typedef GraphNode *PGraphNode; 
 
#define INNER    pointer1    /* T_REP, T_OPT, T_ALT  */ 
#define ALT      pointer2    /* next T_ALT alternative 
                                T_NT link to attributes*/ 
#define SYMLINK  pointer1    /* T_T, T_WT, T_NT link to table */ 
 
#define SETLINK1 pointer2    /* T_W, T_SYNC, T_ANY link to Sets */ 
#define SETLINK2 pointer3 
 
#define SEMPOS   pointer1    /* T_ATTR, T_SEM */ 
#define SEMLEN   pointer2 
#define SEMLINE  pointer3 
#define SEMCOL   pointer4 
 
#define STATE    pointer3    /* NFA graph */ 
#define CONTEXT  pointer4 
 
int  MakeGraph(int type, int sem_link); 
int  MakeSemGraph(int type, long filepos, int len, int line, int col); 
int  MakeGraphOp(int type, int link); 
int  LinkGraph(int current, int next); 
int  LinkAltGraph(int current, int nextalt); 
void SetGraphLine(int current, int line); 
void ShowGraph(int graph); 
void CleanGraphTab(); 
 
#define GetGraphP(p) (PGraphNode) Collection_At(&nodes_tab, p) 
 
/****************************************************************** 
     Terminal Definitions and Functions 
********************************************************************/ 
 
typedef struct { 
  Name name;             /* Terminal Name */ 
  Name gen_name;         /* output name */ 
  byte type; 
} TermNode; 
 
typedef TermNode* PTermNode; 
 
int  FindTerm(PName name); 
void SetTermName(PTermNode tn); 
int  NewTerm(PName  name); 
void GetTermName(int sp, PName name); 
void ShowTermTab(); 
#define GetTermP(p)     (PTermNode) Collection_At(&term_tab, p) 
 
/****************************************************************** 
     Class Definitions and Functions 
********************************************************************/ 
 
typedef struct { 
  Name name;             /* Set Name */ 
  Set  data;             /* Set of Elements */ 
} ClassNode; 
 
typedef ClassNode *PClassNode; 
 
int  FindClass(PName name); 
int  FindClassWithSet(PSet data); 
int  GetClassWithName(PName name, Set *data); 
int  GetClassWithData(PSet data); 
int  NewClass(PName name, PSet set); 
void ShowClassTab(); 
#define GetClassP(p)     (PClassNode) Collection_At(&class_tab, p) 
 
/****************************************************************** 
     Symbol Sets Definitions and Functions 
********************************************************************/ 
 
#define ALL_SYNCS   0 
 
typedef struct { 
  Set  set;              /* Symbols Set */ 
  byte type;             /* Type Of Set (T_ANY, T_SYNC, T_WEEK) */ 
} SymSetNode; 
 
typedef SymSetNode *PSymSetNode; 
 
int  NewSymSet(PSet set, byte typ); 
int  NewANY(); 
void GetSymSet(int index, PSet set); 
void IncludeSymSet(int index, PSet set); 
void ExcludeSymSet(int index, PSet set); 
void ShowSymSetTab(); 
#define GetSymSetP(p)     (PSymSetNode) Collection_At(&symset_tab, p) 
 
/****************************************************************** 
     Non-Terminal Definitions and Functions 
********************************************************************/ 
 
typedef struct { 
  Name name;             /* No Terminal Name */ 
  int  graph;            /* EBNF graph */ 
  int  has_attr;         /* TRUE => Attributes */ 
  int  attr; 
  int  sem;              /* > 0 => Semantic */ 
  int  line_dec;         /* Line Number (for Error reporting) */ 
  int  line_use; 
  int  nullable;         /* TRUE => Nullable */ 
  int  ready;            /* TRUE => First Set Ready */ 
  int  reachable;        /* TRUE => Reachable (Used in RHS of a production) */ 
  Set  first;            /* First Set */ 
  Set  follow;           /* Follow Set */ 
  Set  AuxNt;            /* Auxiliary No Terminal Set */ 
} NTermNode; 
 
typedef NTermNode *PNTermNode; 
 
int FindNTerm(PName name); 
int NewNTerm(PName  name); 
void ShowNTermTab(); 
 
#define GetNTermP(p)     (PNTermNode) Collection_At(&nterm_tab, p) 
 
/****************************************************************** 
     Pragma Definitions and Functions 
********************************************************************/ 
 
typedef struct { 
  Name name;             /* Terminal Name */ 
  int has_attr; 
  struct SemText sem_text; 
} PragmaNode; 
 
typedef PragmaNode *PPragmaNode; 
int  FindPragma(PName name); 
int  NewPragma(PName name); 
void SetPragmaText(int sp, int gp); 
void SetupPragmas(); 
 
#define GetPragmaP(p)     (PPragmaNode) Collection_At(&pragma_tab, p) 
#define FIRST_PRAGMA      1024 
 
/****************************************************************** 
     Names Definitions and Functions 
********************************************************************/ 
 
typedef struct { 
  Name name;             /* Terminal Name */ 
  Name user_name; 
} NameNode; 
 
typedef NameNode *PNameNode; 
int  FindName(PName name); 
void NewName(PName name, PName user_name); 
#define GetNameP(p)     (PNameNode) Collection_At(&name_tab, p) 
 
/****************************************************************** 
     General purpose Definitions and Functions 
********************************************************************/ 
 
void upcase(char *s); 
void AddIgnore(PSet set); 
int  NewSym(PName name, int typ); 
int  FindSym(PName name, int *typ); 
 
void InitTab(); 
void DoneTab(); 
 
int  IsNullableGraph(int gp); 
void CompFirstSet(int gp, PSet first); 
void CompExpected(int gp, int nt, PSet set); 
void CompFollowNode(int gp, int fgp); 
void CompSymbolSets(); 
 
void PrintAscii(int s); 
void PrintInt(int i); 
 
void SetOptions(char *s); 
extern void GenSemError(int nr); /* crp.c */ 
 
extern Collection nterm_tab; 
extern Collection term_tab; 
extern Collection nodes_tab; 
extern Collection class_tab; 
extern Collection symset_tab; 
extern Collection pragma_tab; 
extern Collection name_tab; /* ++++ */ 
 
extern struct SemText global_defs; 
extern int ignore_case; 
extern int first_weak_set; 
extern int no_sym; 
extern FILE *lstfile; 
extern Set  ANY_SET; 
extern Set  ALL_TERMS; 
 
extern int C_option;     /* TRUE => Generate Compiler */ 
extern int F_option;     /* TRUE => First & Follow */ 
extern int G_option;     /* TRUE => graph listing */ 
extern int L_option;     /* TRUE => Generate listing */ 
extern int P_option;     /* TRUE => Generate Parser Only */ 
extern int O_option;     /* TRUE => Generate OR only Terminal conditions */ 
extern int S_option;     /* TRUE => Symbol Table Listing */ 
extern int T_option;     /* TRUE => Gramar Test Only */ 
extern int A_option;     /* TRUE => Trace Automata */ 
extern int D_option;     /* TRUE => Debug #line */ 
extern int Z_option;     /* TRUE => generate .hpp and .cpp files */ 
extern int GenCplusplus; 
 
extern char Frames_Path[]; 
extern char c_ext[]; 
extern char h_ext[]; 
 
 
#endif  /* CRT_MODULE */