git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8964 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			391 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			391 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * syn.h
 | |
|  *
 | |
|  * This file includes definitions and macros associated with syntax diagrams
 | |
|  *
 | |
|  * SOFTWARE RIGHTS
 | |
|  *
 | |
|  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
 | |
|  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
 | |
|  * company may do whatever they wish with source code distributed with
 | |
|  * PCCTS or the code generated by PCCTS, including the incorporation of
 | |
|  * PCCTS, or its output, into commerical software.
 | |
|  *
 | |
|  * We encourage users to develop software with PCCTS.  However, we do ask
 | |
|  * that credit is given to us for developing PCCTS.  By "credit",
 | |
|  * we mean that if you incorporate our source code into one of your
 | |
|  * programs (commercial product, research project, or otherwise) that you
 | |
|  * acknowledge this fact somewhere in the documentation, research report,
 | |
|  * etc...  If you like PCCTS and have developed a nice tool with the
 | |
|  * output, please mention that you developed it using PCCTS.  In
 | |
|  * addition, we ask that this header remain intact in our source code.
 | |
|  * As long as these guidelines are kept, we expect to continue enhancing
 | |
|  * this system and expect to make other tools available as they are
 | |
|  * completed.
 | |
|  *
 | |
|  * ANTLR 1.33
 | |
|  * Terence Parr
 | |
|  * Parr Research Corporation
 | |
|  * with Purdue University and AHPCRC, University of Minnesota
 | |
|  * 1989-2001
 | |
|  */
 | |
| 
 | |
| #include "set.h"
 | |
| 
 | |
| #define NumNodeTypes	4
 | |
| #define NumJuncTypes	9
 | |
| 
 | |
| /* List the different node types */
 | |
| #define nJunction		1
 | |
| #define nRuleRef		2
 | |
| #define nToken			3
 | |
| #define nAction			4
 | |
| 
 | |
| /* Different types of junctions */
 | |
| #define aSubBlk			1
 | |
| #define aOptBlk			2
 | |
| #define aLoopBlk		3
 | |
| #define EndBlk			4
 | |
| #define RuleBlk			5
 | |
| #define Generic			6	/* just a junction--no unusual characteristics */
 | |
| #define EndRule			7
 | |
| #define aPlusBlk		8
 | |
| #define aLoopBegin		9
 | |
| 
 | |
| typedef int NodeType;
 | |
| 
 | |
| #define TreeBlockAllocSize		500
 | |
| #define JunctionBlockAllocSize	200
 | |
| #define ActionBlockAllocSize	50
 | |
| #define RRefBlockAllocSize		100
 | |
| #define TokenBlockAllocSize		100
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| class ActionNode;
 | |
| class Junction;
 | |
| #endif
 | |
| 
 | |
| /* note that 'right' is used by the tree node allocator as a ptr for linked list */
 | |
| typedef struct _tree {
 | |
| 			struct _tree *down, *right;
 | |
| 			int token;
 | |
| 			union {
 | |
| 				int rk;	/* if token==EpToken, => how many more tokens req'd */
 | |
| 				struct _tree *tref;	/* if token==TREE_REF */
 | |
| 				set sref;			/* if token==SET */
 | |
| 			} v;
 | |
| #ifdef TREE_DEBUG
 | |
| 			int in_use;
 | |
|             int seq;
 | |
| #endif
 | |
| 		} Tree;
 | |
| 
 | |
| 
 | |
| /* a predicate is defined to be a predicate action and a token tree with
 | |
|  * context info (if used); later, this struct may include the
 | |
|  * "hoisting distance" when we hoist past tokens.
 | |
|  *
 | |
|  * A tree is used to indicate && vs ||
 | |
|  *
 | |
|  *    p
 | |
|  *    |
 | |
|  *    q--r
 | |
|  *
 | |
|  * indicates p && (q||r).
 | |
|  *
 | |
|  * If expr is PRED_AND_LIST or PRED_OR_LIST, then it's an operation node
 | |
|  * and indicates the start of an && or || list.
 | |
|  */
 | |
| 
 | |
| typedef struct _Predicate {
 | |
| 	struct _Predicate *down, *right;	/* these have to be first */
 | |
| 	struct _Predicate *up, *left;		/* doubly-link me */
 | |
| 	char *expr;
 | |
| 	Tree *tcontext;	/* used if lookahead depth of > one is needed (tree) */
 | |
| 	int k;			/* lookahead depth for this tcontext */
 | |
| 	set scontext[2];/* used if lookahead depth of one is needed (set) */
 | |
| 					/* scontext[0] is not used; only needed so genExprSets()
 | |
| 					   routine works (it expects an array)
 | |
| 					 */
 | |
| 	set completionTree;	/* which lookahead depths are required to complete tcontext? */
 | |
|     set completionSet;  /* MR10 separate completion set for sets and trees           */
 | |
|     struct _PredEntry *predEntry;         /* MR11 */
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| 	ActionNode *source;	/* where did this predicate come from? */
 | |
| #else
 | |
| 	struct _anode *source;	/* where did this predicate come from? */
 | |
| #endif
 | |
| 
 | |
|     char             cloned;               /* MR10 don't want to free original guard pred */
 | |
|     char             redundant;            /* MR10 predicate tree simplification          */
 | |
|     char             ampersandStyle;       /* MR10  (g)? && <<p>>?                        */
 | |
|     char             inverted;             /* MR11 ! predName */
 | |
|     char             isConst;              /* MR11 */
 | |
|     char             constValue;           /* MR11 */
 | |
|     char             conflictReported;     /* MR11 */
 | |
| 
 | |
|     set              plainSet;             /* MR12b */
 | |
| 
 | |
|     /*** remember to change new_predicate() and predicate_dup() when changing this ***/
 | |
| 
 | |
| } Predicate;
 | |
| 
 | |
| typedef struct _ExceptionHandler {
 | |
| 			char *signalname;
 | |
| 			char *action;
 | |
| 		} ExceptionHandler;
 | |
| 
 | |
| typedef struct _ExceptionGroup {
 | |
| 			struct _ListNode *handlers; /* list of ExceptionHandler's */
 | |
| 			char *label;		/* label==""; implies not attached to any
 | |
| 								 * particular rule ref.
 | |
| 								 */
 | |
| 			char *altID;		/* which alt did it come from (blk#:alt#) */
 | |
| 
 | |
|             struct _ExceptionGroup  *pendingLink; /* for alternative EG MR7 */
 | |
|             struct _ExceptionGroup  *outerEG;     /* for alternative EG MR7 */
 | |
|             struct _LabelEntry      *labelEntry;  /* for alternative EG MR7 */
 | |
|             int                     forRule;                         /* MR7 */
 | |
|             int                     used;                            /* MR7 */
 | |
| 		} ExceptionGroup ;
 | |
| 
 | |
| 
 | |
| #define TokenString(_i)			((TokenInd!=NULL)?TokenStr[TokenInd[_i]]:TokenStr[_i])
 | |
| #define ExprString(_i)			((TokenInd!=NULL)?ExprStr[TokenInd[_i]]:ExprStr[_i])
 | |
| 
 | |
| 
 | |
| 				/* M e s s a g e  P a s s i n g  T o  N o d e s */
 | |
| 
 | |
| /*
 | |
|  * assumes a 'Junction *r' exists.  This macro calls a function with
 | |
|  * the pointer to the node to operate on and a pointer to the rule
 | |
|  * in which it is enclosed.
 | |
|  */
 | |
| #define TRANS(p)	{if ( (p)==NULL ) fatal("TRANS: NULL object");		\
 | |
| 					if ( (p)->ntype == nJunction ) (*(fpJTrans[((Junction *)(p))->jtype]))( p );\
 | |
| 					else (*(fpTrans[(p)->ntype]))( p );}
 | |
| 
 | |
| #define PRINT(p)	{if ( (p)==NULL ) fatal("PRINT: NULL object");\
 | |
| 					(*(fpPrint[(p)->ntype]))( p );}
 | |
| 
 | |
| #define REACH(p,k,rk,a) {if ( (p)==NULL ) fatal("REACH: NULL object");\
 | |
| 					(a) = (*(fpReach[(p)->ntype]))( p, k, rk );}
 | |
| 
 | |
| #define TRAV(p,k,rk,a) {if ( (p)==NULL ) {\
 | |
| 					  if ( ContextGuardTRAV ) (a)=NULL; \
 | |
| 					  else fatal("TRAV: NULL object");\
 | |
| 				    } \
 | |
| 					else (a) = (*(fpTraverse[(p)->ntype]))( p, k, rk );}
 | |
| 
 | |
| /**
 | |
| *** #define TRAV(p,k,rk,a) {if ( (p)==NULL ) fatal("TRAV: NULL object");\
 | |
| ***					(a) = (*(fpTraverse[(p)->ntype]))( p, k, rk );}
 | |
| **/
 | |
| 
 | |
| /* All syntax diagram nodes derive from Node -- superclass
 | |
|  */
 | |
| #ifdef __cplusplus
 | |
| class Node {
 | |
| public:
 | |
| 			NodeType ntype;
 | |
| 			char *rname;		/* what rule does this element live in? */
 | |
| 			int file;			/* index in FileStr */
 | |
| 			int line;			/* line number that element occurs on */
 | |
| 		};
 | |
| #else
 | |
| typedef struct _node {
 | |
| 			NodeType ntype;
 | |
| 			char *rname;		/* what rule does this element live in? */
 | |
| 			int file;			/* index in FileStr */
 | |
| 			int line;			/* line number that element occurs on */
 | |
| 		} Node;
 | |
| #endif
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| class ActionNode : public Node {
 | |
| public:
 | |
| #else
 | |
| typedef struct _anode {
 | |
| 			NodeType ntype;
 | |
| 			char *rname;		/* what rule does this action live in? */
 | |
| 			int file;			/* index in FileStr (name of file with action) */
 | |
| 			int line;			/* line number that action occurs on */
 | |
| #endif
 | |
| 			Node *next;
 | |
| 			char *action;
 | |
| 			int is_predicate;	/* true if action is a <<...>>? predicate action */
 | |
| 			int done;			/* don't dump if action dumped (used for predicates) */
 | |
| 			int init_action;	/* is this the 1st action of 1st prod of block? */
 | |
| 			char *pred_fail;	/* what to do/print when predicate fails */
 | |
| 			Predicate  *guardpred;	/* if '(context)? =>' was present, already done */
 | |
| 			unsigned char frmwarned;/* have we dumped a warning for pred yet? */
 | |
| 			unsigned char ctxwarned;/* have we dumped a warning for pred yet? */
 | |
|             unsigned char predTooLong;     /* MR10 have we dumped warning for pred yet */
 | |
|             unsigned char noHoist;         /* MR12 literally "noHoist" */
 | |
|             Predicate         *ampersandPred;     /* MR10   (g)? && <<p>>? expr   */
 | |
| #ifdef __cplusplus
 | |
|             Junction          *guardNodes;        /* MR11 */
 | |
| #else
 | |
|             struct _junct     *guardNodes;        /* MR11 */
 | |
| #endif
 | |
|             struct _PredEntry *predEntry;         /* MR11 */
 | |
|             int               inverted;           /* MR11 <<!predSymbol>>? */
 | |
| #ifdef __cplusplus
 | |
| 		};
 | |
| #else
 | |
| 		} ActionNode;
 | |
| #endif
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| class TokNode : public Node {
 | |
| public:
 | |
| #else
 | |
| typedef struct _toknode {
 | |
| 			NodeType ntype;
 | |
| 			char *rname;		/* name of rule it's in */
 | |
| 			int file;			/* index in FileStr (name of file with rule) */
 | |
| 			int line;			/* line number that token occurs on */
 | |
| #endif
 | |
| 			Node *next;
 | |
| 			int token;
 | |
| 			int astnode;		/* leaf/root/excluded (used to build AST's) */
 | |
| 			unsigned char label;/* token label or expression ? */
 | |
| 			unsigned char remapped;
 | |
| 								/* used if token id's are forced to certain positions;
 | |
| 								 * a function walks the tree reassigning token numbers */
 | |
| 			int upper_range;    /* MR13 - was char */
 | |
| 								/* used only if Token is of type T1..T2; in this case,
 | |
| 								 * use token..upper_range as the range; else
 | |
| 								 * upper_range must be 0 */
 | |
| 			unsigned char wild_card;
 | |
| 								/* indicates that the token is the "." wild-card;
 | |
| 								 * field token is ignored if wild_card is set
 | |
| 								 */
 | |
| 			unsigned int elnum; /* element number within the alternative */
 | |
| #ifdef __cplusplus
 | |
| 			Junction *altstart;	/* pointer to node that starts alt */
 | |
| #else
 | |
| 			struct _junct *altstart;	/* pointer to node that starts alt */
 | |
| #endif
 | |
| 			struct _TCnode *tclass;		/* token class if tokclass ref */
 | |
| 			set tset;			/* set of tokens represented by meta token */
 | |
| 			char *el_label;		/* el_label:toknode */
 | |
| 			unsigned char complement;	/* complement the set? */
 | |
| 			ExceptionGroup *ex_group;	/* any exception[el_label] attached? */
 | |
|             unsigned char use_def_MT_handler;
 | |
|             unsigned char label_used_in_semantic_pred;  /* MR10 */
 | |
| #ifdef __cplusplus
 | |
| 		};
 | |
| #else
 | |
| 		} TokNode;
 | |
| #endif
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| class RuleRefNode : public Node {
 | |
| public:
 | |
| #else
 | |
| typedef struct _rrnode {
 | |
| 			NodeType ntype;
 | |
| 			char *rname;		/* name of rule it's in */
 | |
| 			int file;			/* index in FileStr (name of file with rule)
 | |
| 								   it's in */
 | |
| 			int line;			/* line number that rule ref occurs on */
 | |
| #endif
 | |
| 			Node *next;
 | |
| 			char *text;			/* reference to which rule */
 | |
| 			char *parms;		/* point to parameters of rule invocation
 | |
| 								   (if present) */
 | |
| 			char *assign;		/* point to left-hand-side of assignment
 | |
| 								   (if any) */
 | |
| 			int linked;			/* Has a FoLink already been established? */
 | |
| 			int astnode;		/* excluded? (used to build AST's) */
 | |
| 			unsigned int elnum; /* element number within the alternative */
 | |
| #ifdef __cplusplus
 | |
| 			Junction *altstart;
 | |
| #else
 | |
| 			struct _junct *altstart;
 | |
| #endif
 | |
| 			char *el_label;		/* el_label:rrnode */
 | |
| 			ExceptionGroup *ex_group;	/* any exception[el_label] attached? */
 | |
| #ifdef __cplusplus
 | |
| 		};
 | |
| #else
 | |
| 		} RuleRefNode;
 | |
| #endif
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| class Junction : public Node {
 | |
| public:
 | |
| #else
 | |
| typedef struct _junct {
 | |
| 			NodeType ntype;
 | |
| 			char *rname;		/* name of rule junction is in */
 | |
| 			int file;			/* index in FileStr (name of file with rule)
 | |
| 								   if blk == RuleBlk */
 | |
| 			int line;			/* line number that rule occurs on */
 | |
| #endif
 | |
|             int seq;            /* MR10 sequence number */
 | |
| 			char ignore;		/* used by FIRST computation to ignore
 | |
| 								   empty alt added for the (...)+ blks */
 | |
| 			char visited;		/* used by recursive routines to avoid
 | |
| 								   infinite recursion */
 | |
| 			char pvisited;		/* used by print routines to avoid
 | |
| 								   infinite recursion */
 | |
| 			char fvisited;		/* used by FoLink() to avoid
 | |
| 								   infinite recursion */
 | |
| 			char *lock;			/* used by REACH to track infinite recursion */
 | |
| 			char *pred_lock;	/* used by find_predicates to track infinite recursion */
 | |
| 			int altnum;			/* used in subblocks. altnum==0 means not an
 | |
| 								   alt of subrule */
 | |
| 			int jtype;			/* annotation for code-gen/FIRST/FOLLOW.
 | |
| 								   Junction type */
 | |
| #ifdef __cplusplus
 | |
| 			Junction *end;		/* pointer to node with EndBlk in it
 | |
| 								   if blk == a block type */
 | |
| #else
 | |
| 			struct _junct *end;	/* pointer to node with EndBlk in it
 | |
| 								   if blk == a block type */
 | |
| #endif
 | |
| 			Node *p1, *p2;
 | |
| 			char  halt;			/* never move past a junction with halt==TRUE */ /* MR10 was int */
 | |
| 			char *pdecl;		/* point to declaration of parameters on rule
 | |
| 								   (if present) */
 | |
| 			char *parm;			/* point to parameter of block invocation
 | |
| 								   (if present) */
 | |
| 			char predparm;		/* indicates that the 'parm' is a predicate
 | |
| 								 * to be used in the while loop generated
 | |
| 								 * for blocks */ /* MR10 was int */
 | |
| 			char *ret;			/* point to return type of rule (if present) */
 | |
| 			char *erraction;	/* point to error action (if present) */
 | |
| 			int blockid;		/* this is a unique ID */
 | |
| 			char *exception_label;	/* goto label for this alt */
 | |
| 			set *fset;			/* used for code generation */
 | |
| 			Tree *ftree;		/* used for code generation */
 | |
| 			Predicate *predicate;/* predicate that can be used to disambiguate */
 | |
| 			char guess;			/* true if (...)? block */
 | |
|             char alpha_beta_guess_end;      /* MR14 1 => end block of guess sub block  */
 | |
|             Node *guess_analysis_point;     /* MR14 */
 | |
| 			char approx;		/* limit block to use linear approx lookahead? */
 | |
| 			set tokrefs;		/* if ith element of alt is tokref then i is member */
 | |
| 			set rulerefs;		/* if ith element of alt is rule ref then i is member */
 | |
| 			struct _ListNode *exceptions; /* list of exceptions groups for rule */
 | |
| 			struct _ListNode *el_labels;  /* list of element labels for rule */
 | |
|             ExceptionGroup   *outerEG;                               /* MR7 */
 | |
|             int              curAltNum;                              /* MR7 */
 | |
|             char* pFirstSetSymbol;   /* #pragma FirstSetSymbol(Foo)     MR21 */
 | |
| #ifdef __cplusplus
 | |
|             Junction         *pendingLink;                           /* MR7 */
 | |
| #else
 | |
|             struct _junct    *pendingLink;                           /* MR7 */
 | |
| #endif
 | |
|             char             overlap_warning;                        /* MR10 */
 | |
| #ifdef __cplusplus
 | |
| 		};
 | |
| #else
 | |
| 		} Junction;
 | |
| #endif
 | |
| 
 | |
| typedef struct { Node *left, *right;} Graph;
 | |
| 
 |