/* | |
* 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; | |