syn.h
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:14k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * syn.h
  3.  *
  4.  * This file includes definitions and macros associated with syntax diagrams
  5.  *
  6.  * SOFTWARE RIGHTS
  7.  *
  8.  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
  9.  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
  10.  * company may do whatever they wish with source code distributed with
  11.  * PCCTS or the code generated by PCCTS, including the incorporation of
  12.  * PCCTS, or its output, into commerical software.
  13.  *
  14.  * We encourage users to develop software with PCCTS.  However, we do ask
  15.  * that credit is given to us for developing PCCTS.  By "credit",
  16.  * we mean that if you incorporate our source code into one of your
  17.  * programs (commercial product, research project, or otherwise) that you
  18.  * acknowledge this fact somewhere in the documentation, research report,
  19.  * etc...  If you like PCCTS and have developed a nice tool with the
  20.  * output, please mention that you developed it using PCCTS.  In
  21.  * addition, we ask that this header remain intact in our source code.
  22.  * As long as these guidelines are kept, we expect to continue enhancing
  23.  * this system and expect to make other tools available as they are
  24.  * completed.
  25.  *
  26.  * ANTLR 1.33
  27.  * Terence Parr
  28.  * Parr Research Corporation
  29.  * with Purdue University and AHPCRC, University of Minnesota
  30.  * 1989-1998
  31.  */
  32. #include "set.h"
  33. #define NumNodeTypes 4
  34. #define NumJuncTypes 9
  35. /* List the different node types */
  36. #define nJunction 1
  37. #define nRuleRef 2
  38. #define nToken 3
  39. #define nAction 4
  40. /* Different types of junctions */
  41. #define aSubBlk 1
  42. #define aOptBlk 2
  43. #define aLoopBlk 3
  44. #define EndBlk 4
  45. #define RuleBlk 5
  46. #define Generic 6 /* just a junction--no unusual characteristics */
  47. #define EndRule 7
  48. #define aPlusBlk 8
  49. #define aLoopBegin 9
  50. typedef int NodeType;
  51. #define TreeBlockAllocSize 500
  52. #define JunctionBlockAllocSize 200
  53. #define ActionBlockAllocSize 50
  54. #define RRefBlockAllocSize 100
  55. #define TokenBlockAllocSize 100
  56. #ifdef __cplusplus
  57. class ActionNode;
  58. class Junction;
  59. #endif
  60. /* note that 'right' is used by the tree node allocator as a ptr for linked list */
  61. typedef struct _tree {
  62. struct _tree *down, *right;
  63. int token;
  64. union {
  65. int rk; /* if token==EpToken, => how many more tokens req'd */
  66. struct _tree *tref; /* if token==TREE_REF */
  67. set sref; /* if token==SET */
  68. } v;
  69. #ifdef TREE_DEBUG
  70. int in_use;
  71.             int seq;
  72. #endif
  73. } Tree;
  74. /* a predicate is defined to be a predicate action and a token tree with
  75.  * context info (if used); later, this struct may include the
  76.  * "hoisting distance" when we hoist past tokens.
  77.  *
  78.  * A tree is used to indicate && vs ||
  79.  *
  80.  *    p
  81.  *    |
  82.  *    q--r
  83.  *
  84.  * indicates p && (q||r).
  85.  *
  86.  * If expr is PRED_AND_LIST or PRED_OR_LIST, then it's an operation node
  87.  * and indicates the start of an && or || list.
  88.  */
  89. typedef struct _Predicate {
  90. struct _Predicate *down, *right; /* these have to be first */
  91. struct _Predicate *up, *left; /* doubly-link me */
  92. char *expr;
  93. Tree *tcontext; /* used if lookahead depth of > one is needed (tree) */
  94. int k; /* lookahead depth for this tcontext */
  95. set scontext[2];/* used if lookahead depth of one is needed (set) */
  96. /* scontext[0] is not used; only needed so genExprSets()
  97.    routine works (it expects an array)
  98.  */
  99. set completionTree; /* which lookahead depths are required to complete tcontext? */
  100.     set completionSet;  /* MR10 separate completion set for sets and trees           */
  101.     struct _PredEntry *predEntry;         /* MR11 */
  102. #ifdef __cplusplus
  103. ActionNode *source; /* where did this predicate come from? */
  104. #else
  105. struct _anode *source; /* where did this predicate come from? */
  106. #endif
  107.     char             cloned;               /* MR10 don't want to free original guard pred */
  108.     char             redundant;            /* MR10 predicate tree simplification          */
  109.     char             ampersandStyle;       /* MR10  (g)? && <<p>>?                        */
  110.     char             inverted;             /* MR11 ! predName */
  111.     char             isConst;              /* MR11 */
  112.     char             constValue;           /* MR11 */
  113.     char             conflictReported;     /* MR11 */
  114.     set              plainSet;             /* MR12b */
  115.     /*** remember to change new_predicate() and predicate_dup() when changing this ***/
  116. } Predicate;
  117. typedef struct _ExceptionHandler {
  118. char *signalname;
  119. char *action;
  120. } ExceptionHandler;
  121. typedef struct _ExceptionGroup {
  122. struct _ListNode *handlers; /* list of ExceptionHandler's */
  123. char *label; /* label==""; implies not attached to any
  124.  * particular rule ref.
  125.  */
  126. char *altID; /* which alt did it come from (blk#:alt#) */
  127.             struct _ExceptionGroup  *pendingLink; /* for alternative EG MR7 */
  128.             struct _ExceptionGroup  *outerEG;     /* for alternative EG MR7 */
  129.             struct _LabelEntry      *labelEntry;  /* for alternative EG MR7 */
  130.             int                     forRule;                         /* MR7 */
  131.             int                     used;                            /* MR7 */
  132. } ExceptionGroup ;
  133. #define TokenString(_i) ((TokenInd!=NULL)?TokenStr[TokenInd[_i]]:TokenStr[_i])
  134. #define ExprString(_i) ((TokenInd!=NULL)?ExprStr[TokenInd[_i]]:ExprStr[_i])
  135. /* M e s s a g e  P a s s i n g  T o  N o d e s */
  136. /*
  137.  * assumes a 'Junction *r' exists.  This macro calls a function with
  138.  * the pointer to the node to operate on and a pointer to the rule
  139.  * in which it is enclosed.
  140.  */
  141. #define TRANS(p) {if ( (p)==NULL ) fatal("TRANS: NULL object");
  142. if ( (p)->ntype == nJunction ) (*(fpJTrans[((Junction *)(p))->jtype]))( p );
  143. else (*(fpTrans[(p)->ntype]))( p );}
  144. #define PRINT(p) {if ( (p)==NULL ) fatal("PRINT: NULL object");
  145. (*(fpPrint[(p)->ntype]))( p );}
  146. #define REACH(p,k,rk,a) {if ( (p)==NULL ) fatal("REACH: NULL object");
  147. (a) = (*(fpReach[(p)->ntype]))( p, k, rk );}
  148. #define TRAV(p,k,rk,a) {if ( (p)==NULL ) {
  149.   if ( ContextGuardTRAV ) (a)=NULL; 
  150.   else fatal("TRAV: NULL object");
  151.     } 
  152. else (a) = (*(fpTraverse[(p)->ntype]))( p, k, rk );}
  153. /**
  154. *** #define TRAV(p,k,rk,a) {if ( (p)==NULL ) fatal("TRAV: NULL object");
  155. *** (a) = (*(fpTraverse[(p)->ntype]))( p, k, rk );}
  156. **/
  157. /* All syntax diagram nodes derive from Node -- superclass
  158.  */
  159. #ifdef __cplusplus
  160. class Node {
  161. public:
  162. NodeType ntype;
  163. char *rname; /* what rule does this element live in? */
  164. int file; /* index in FileStr */
  165. int line; /* line number that element occurs on */
  166. };
  167. #else
  168. typedef struct _node {
  169. NodeType ntype;
  170. char *rname; /* what rule does this element live in? */
  171. int file; /* index in FileStr */
  172. int line; /* line number that element occurs on */
  173. } Node;
  174. #endif
  175. #ifdef __cplusplus
  176. class ActionNode : public Node {
  177. public:
  178. #else
  179. typedef struct _anode {
  180. NodeType ntype;
  181. char *rname; /* what rule does this action live in? */
  182. int file; /* index in FileStr (name of file with action) */
  183. int line; /* line number that action occurs on */
  184. #endif
  185. Node *next;
  186. char *action;
  187. int is_predicate; /* true if action is a <<...>>? predicate action */
  188. int done; /* don't dump if action dumped (used for predicates) */
  189. int init_action; /* is this the 1st action of 1st prod of block? */
  190. char *pred_fail; /* what to do/print when predicate fails */
  191. Predicate  *guardpred; /* if '(context)? =>' was present, already done */
  192. unsigned char frmwarned;/* have we dumped a warning for pred yet? */
  193. unsigned char ctxwarned;/* have we dumped a warning for pred yet? */
  194.             unsigned char predTooLong;     /* MR10 have we dumped warning for pred yet */
  195.             unsigned char noHoist;       /* MR12 literally "noHoist" */
  196.             Predicate         *ampersandPred;     /* MR10   (g)? && <<p>>? expr   */
  197. #ifdef __cplusplus
  198.             Junction          *guardNodes;        /* MR11 */
  199. #else
  200.             struct _junct     *guardNodes;        /* MR11 */
  201. #endif
  202.             struct _PredEntry *predEntry;         /* MR11 */
  203.             int               inverted;           /* MR11 <<!predSymbol>>? */
  204. #ifdef __cplusplus
  205. };
  206. #else
  207. } ActionNode;
  208. #endif
  209. #ifdef __cplusplus
  210. class TokNode : public Node {
  211. public:
  212. #else
  213. typedef struct _toknode {
  214. NodeType ntype;
  215. char *rname; /* name of rule it's in */
  216. int file; /* index in FileStr (name of file with rule) */
  217. int line; /* line number that token occurs on */
  218. #endif
  219. Node *next;
  220. int token;
  221. int astnode; /* leaf/root/excluded (used to build AST's) */
  222. unsigned char label;/* token label or expression ? */
  223. unsigned char remapped;
  224. /* used if token id's are forced to certain positions;
  225.  * a function walks the tree reassigning token numbers */
  226. int upper_range;    /* MR13 - was char */
  227. /* used only if Token is of type T1..T2; in this case,
  228.  * use token..upper_range as the range; else
  229.  * upper_range must be 0 */
  230. unsigned char wild_card;
  231. /* indicates that the token is the "." wild-card;
  232.  * field token is ignored if wild_card is set
  233.  */
  234. unsigned int elnum; /* element number within the alternative */
  235. #ifdef __cplusplus
  236. Junction *altstart; /* pointer to node that starts alt */
  237. #else
  238. struct _junct *altstart; /* pointer to node that starts alt */
  239. #endif
  240. struct _TCnode *tclass; /* token class if tokclass ref */
  241. set tset; /* set of tokens represented by meta token */
  242. char *el_label; /* el_label:toknode */
  243. unsigned char complement; /* complement the set? */
  244. ExceptionGroup *ex_group; /* any exception[el_label] attached? */
  245.             unsigned char use_def_MT_handler;
  246.             unsigned char label_used_in_semantic_pred;  /* MR10 */
  247. #ifdef __cplusplus
  248. };
  249. #else
  250. } TokNode;
  251. #endif
  252. #ifdef __cplusplus
  253. class RuleRefNode : public Node {
  254. public:
  255. #else
  256. typedef struct _rrnode {
  257. NodeType ntype;
  258. char *rname; /* name of rule it's in */
  259. int file; /* index in FileStr (name of file with rule)
  260.    it's in */
  261. int line; /* line number that rule ref occurs on */
  262. #endif
  263. Node *next;
  264. char *text; /* reference to which rule */
  265. char *parms; /* point to parameters of rule invocation
  266.    (if present) */
  267. char *assign; /* point to left-hand-side of assignment
  268.    (if any) */
  269. int linked; /* Has a FoLink already been established? */
  270. int astnode; /* excluded? (used to build AST's) */
  271. unsigned int elnum; /* element number within the alternative */
  272. #ifdef __cplusplus
  273. Junction *altstart;
  274. #else
  275. struct _junct *altstart;
  276. #endif
  277. char *el_label; /* el_label:rrnode */
  278. ExceptionGroup *ex_group; /* any exception[el_label] attached? */
  279. #ifdef __cplusplus
  280. };
  281. #else
  282. } RuleRefNode;
  283. #endif
  284. #ifdef __cplusplus
  285. class Junction : public Node {
  286. public:
  287. #else
  288. typedef struct _junct {
  289. NodeType ntype;
  290. char *rname; /* name of rule junction is in */
  291. int file; /* index in FileStr (name of file with rule)
  292.    if blk == RuleBlk */
  293. int line; /* line number that rule occurs on */
  294. #endif
  295.             int seq;            /* MR10 sequence number */
  296. char ignore; /* used by FIRST computation to ignore
  297.    empty alt added for the (...)+ blks */
  298. char visited; /* used by recursive routines to avoid
  299.    infinite recursion */
  300. char pvisited; /* used by print routines to avoid
  301.    infinite recursion */
  302. char fvisited; /* used by FoLink() to avoid
  303.    infinite recursion */
  304. char *lock; /* used by REACH to track infinite recursion */
  305. char *pred_lock; /* used by find_predicates to track infinite recursion */
  306. int altnum; /* used in subblocks. altnum==0 means not an
  307.    alt of subrule */
  308. int jtype; /* annotation for code-gen/FIRST/FOLLOW.
  309.    Junction type */
  310. #ifdef __cplusplus
  311. Junction *end; /* pointer to node with EndBlk in it
  312.    if blk == a block type */
  313. #else
  314. struct _junct *end; /* pointer to node with EndBlk in it
  315.    if blk == a block type */
  316. #endif
  317. Node *p1, *p2;
  318. char  halt; /* never move past a junction with halt==TRUE */ /* MR10 was int */
  319. char *pdecl; /* point to declaration of parameters on rule
  320.    (if present) */
  321. char *parm; /* point to parameter of block invocation
  322.    (if present) */
  323. char predparm; /* indicates that the 'parm' is a predicate
  324.  * to be used in the while loop generated
  325.  * for blocks */ /* MR10 was int */
  326. char *ret; /* point to return type of rule (if present) */
  327. char *erraction; /* point to error action (if present) */
  328. int blockid; /* this is a unique ID */
  329. char *exception_label; /* goto label for this alt */
  330. set *fset; /* used for code generation */
  331. Tree *ftree; /* used for code generation */
  332. Predicate *predicate;/* predicate that can be used to disambiguate */
  333. char guess; /* true if (...)? block */
  334.             char alpha_beta_guess_end;      /* MR14 1 => end block of guess sub block  */
  335.             Node *guess_analysis_point;     /* MR14 */
  336. char approx; /* limit block to use linear approx lookahead? */
  337. set tokrefs; /* if ith element of alt is tokref then i is member */
  338. set rulerefs; /* if ith element of alt is rule ref then i is member */
  339. struct _ListNode *exceptions; /* list of exceptions groups for rule */
  340. struct _ListNode *el_labels;  /* list of element labels for rule */
  341.             ExceptionGroup   *outerEG;                               /* MR7 */
  342.             int              curAltNum;                              /* MR7 */
  343. #ifdef __cplusplus
  344.             Junction         *pendingLink;                           /* MR7 */
  345. #else
  346.             struct _junct    *pendingLink;                           /* MR7 */
  347. #endif
  348.             char             overlap_warning;                        /* MR10 */
  349. #ifdef __cplusplus
  350. };
  351. #else
  352. } Junction;
  353. #endif
  354. typedef struct { Node *left, *right;} Graph;