| /* | |
| * globals.c -- File containing all variables/tables visible to all files. | |
| * | |
| * 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 <stdio.h> | |
| #include "pcctscfg.h" | |
| #include "set.h" | |
| #include "syn.h" | |
| #include "hash.h" | |
| #include "generic.h" | |
| char Version[] = "1.33MR33" ; /* PCCTS version number */ /* MRXXX */ | |
| char VersionDef[] = "13333"; /* same (except int equiv for preproc symbol) */ /* MRXXX */ | |
| char LexStartSymbol[] = "START";/* Name of starting lexical class/automaton */ | |
| char *RemapFileName = "remap.h"; | |
| char *DlgFileName = "parser.dlg"; | |
| char *DefFileName = "tokens.h"; | |
| char *ErrFileName = "err.c"; | |
| char *ModeFileName = "mode.h"; | |
| char *StdMsgName = NULL; | |
| char *ParserName = DefaultParserName; | |
| /* list of PCCTS supplied support symbols; these are renamed when more than | |
| * one ANTLR-generated parsers are linked together to avoid name conflicts. | |
| * Can't use '##' ANSIC preprocessor concat operator with K&R and: | |
| * #define zzskip zzparser ## skip | |
| * will not work for ANSI/C++ as 'zzparserskip' is created w/o zzparser | |
| * being substituted--ack!!! | |
| */ | |
| char *StandardSymbols[] = { | |
| /* ANTLR stuff */ | |
| "zzStackOvfMsg", | |
| "zzasp", | |
| "zzaStack", | |
| "inf_tokens", | |
| "inf_text", | |
| "inf_text_buffer", | |
| "inf_text_buffer_ptr", | |
| "inf_text_buffer_size", | |
| "inf_labase", | |
| "inf_last", | |
| "inf_lap", | |
| "zztokenLA", | |
| "zztextLA", | |
| "zzlap", | |
| "zzlabase", | |
| "zztoktext", | |
| "zztoken", | |
| "zzdirty", | |
| "zzguessing", | |
| "zzguess_start", | |
| "zzresynch", | |
| "zzinf_tokens", | |
| "zzinf_text", | |
| "zzinf_text_buffer", | |
| "zzinf_labase", | |
| "zzinf_last", | |
| "zzfill_inf_look", | |
| "zzFAIL", | |
| "zzsave_antlr_state", | |
| "zzrestore_antlr_state", | |
| "zzsyn", | |
| "zzset_el", | |
| "zzset_deg", | |
| "zzedecode", | |
| "_zzsetmatch", | |
| "_zzmatch", | |
| "_inf_zzgettok", | |
| "zzconsumeUntil", | |
| "zzconsumeUntilToken", | |
| "_zzmatch_wsig", | |
| "_zzsetmatch_wsig", | |
| "_zzmatch_wdfltsig", | |
| "_zzsetmatch_wdfltsig", | |
| "zzdflthandlers", | |
| /* DLG stuff */ | |
| "zzreal_line", | |
| "zzcharfull", | |
| "zzerr", | |
| "zzlextext", | |
| "zzbegexpr", | |
| "zzendexpr", | |
| "zzbufsize", | |
| "zzbegcol", | |
| "zzendcol", | |
| "zzline", | |
| "zzchar", | |
| "zzbufovf", | |
| "zzrdstream", | |
| "zzrdfunc", | |
| "zzrdstr", | |
| "zzclose_stream", | |
| "zzsave_dlg_state", | |
| "zzrestore_dlg_state", | |
| "zzmode", | |
| "zzskip", | |
| "zzmore", | |
| "zzreplchar", | |
| "zzreplstr", | |
| "zzgettok", | |
| "zzadvance", | |
| "zzerrstd", | |
| "zzerr_in", | |
| "zzconstr_attr", | |
| "zzempty_attr", | |
| "zzerraction", | |
| "zztokens", /* list of token regular expressions */ | |
| "dfa", | |
| "accepts", | |
| "actions", | |
| "zzTraceOptionValue", /* MR10 */ | |
| "zzTraceGuessOptionValue", /* MR10 */ | |
| "zzTraceCurrentRuleName", /* MR10 */ | |
| "zzTraceDepth", /* MR10 */ | |
| "zzGuessSeq", /* MR10 */ | |
| "zzSyntaxErrCount", /* MR11 */ | |
| "zzLexErrCount", /* MR11 */ | |
| "zzTraceGuessDone", /* MR13 - BJS */ | |
| "zzTraceGuessFail", /* MR13 - BJS */ | |
| "zzTraceGuessOption", /* MR13 - BJS */ | |
| "zzTraceIn", /* MR13 - BJS */ | |
| "zzTraceOption", /* MR13 - BJS */ | |
| "zzTraceOut", /* MR13 - BJS */ | |
| "zzTraceReset", /* MR13 - BJS */ | |
| NULL /* must be present */ | |
| }; | |
| /* list of PCCTS supplied support functions; these are renamed when more than | |
| * one ANTLR-generated parsers are linked together to avoid name conflicts. | |
| */ | |
| char *ASTSymbols[] = { | |
| "AST", | |
| "zzast_sp", | |
| "zzastStack", | |
| "zzlink", | |
| "zzastnew", | |
| "zzsubchild", | |
| "zzsubroot", | |
| "zzpre_ast", | |
| "zzfree_ast", | |
| "zztmake", | |
| "zzdup_ast", | |
| "zztfree", | |
| "zzdouble_link", | |
| NULL /* must be present */ | |
| }; | |
| /* Current ambiguity examination information */ | |
| int CurAmbigAlt1, CurAmbigAlt2, CurAmbigline, CurAmbigfile; | |
| char *CurAmbigbtype; | |
| /* M e t h o d T a b l e s */ | |
| /* | |
| * The following tables are used to fill syntax diagram nodes with the correct | |
| * function pointers for computing FIRST sets and printing themselves. | |
| */ | |
| /* fpTraverse[node type] == pointer to function that calculates trees | |
| * representing the FIRST sets for that node (maintains spatial info). | |
| * We use 'struct _tree' not 'tree' due to a g++ 2.4.3 bug. | |
| */ | |
| #ifdef __cplusplus | |
| struct _tree *(*fpTraverse[NumNodeTypes+1])(... /* Node *, int, set * */) = { | |
| NULL, | |
| (struct _tree *(*)(...)) tJunc, | |
| (struct _tree *(*)(...)) tRuleRef, | |
| (struct _tree *(*)(...)) tToken, | |
| (struct _tree *(*)(...)) tAction | |
| }; | |
| #else | |
| Tree *(*fpTraverse[NumNodeTypes+1])() = { | |
| NULL, | |
| tJunc, | |
| tRuleRef, | |
| tToken, | |
| tAction | |
| }; | |
| #endif | |
| /* fpReach[node type] == pointer to function that calculates FIRST set for | |
| * that node. (r stands for reach). We use 'struct _set' not 'set' | |
| * due to a g++ 2.4.3 bug. | |
| */ | |
| #ifdef __cplusplus | |
| struct _set (*fpReach[NumNodeTypes+1])(... /* Node *, int, set * */) = { | |
| NULL, | |
| (struct _set (*)(...)) rJunc, | |
| (struct _set (*)(...)) rRuleRef, | |
| (struct _set (*)(...)) rToken, | |
| (struct _set (*)(...)) rAction | |
| }; | |
| #else | |
| set (*fpReach[NumNodeTypes+1])() = { | |
| NULL, | |
| rJunc, | |
| rRuleRef, | |
| rToken, | |
| rAction | |
| }; | |
| #endif | |
| /* fpPrint[node type] == pointer to function that knows how to print that node. */ | |
| #ifdef __cplusplus | |
| void (*fpPrint[NumNodeTypes+1])(... /* Node * */) = { | |
| NULL, | |
| (void (*)(...)) pJunc, | |
| (void (*)(...)) pRuleRef, | |
| (void (*)(...)) pToken, | |
| (void (*)(...)) pAction | |
| }; | |
| #else | |
| void (*fpPrint[NumNodeTypes+1])() = { | |
| NULL, | |
| pJunc, | |
| pRuleRef, | |
| pToken, | |
| pAction | |
| }; | |
| #endif | |
| char *decodeJType[] = { | |
| "invalid", | |
| "aSubBlk", | |
| "aOptBlk", | |
| "aLoopBlk", | |
| "EndBlk", | |
| "RuleBlk", | |
| "Generic", | |
| "EndRule", | |
| "aPlusBlk", | |
| "aLoopBegin" | |
| }; | |
| /* H a s h T a b l e s */ | |
| Entry **Tname, /* Table of all token names (maps name to tok num)*/ | |
| **Texpr, /* Table of all token expressions | |
| (maps expr to tok num) */ | |
| **Rname, /* Table of all Rules (has ptr to start of rule) */ | |
| **Fcache, /* Cache of First/Follow Computations */ | |
| **Tcache; /* Tree cache; First/Follow for permute trees */ | |
| Entry **Elabel; /* Table of all element label names */ | |
| Entry **Sname; /* Signal names */ | |
| Entry **Pname; /* symbolic predicate names MR11 */ | |
| /* V a r i a b l e s */ | |
| int Save_argc; /* MR10 */ | |
| char **Save_argv; /* MR10 */ | |
| int EpToken=0; /* Imaginary Epsilon token number */ | |
| int WildCardToken=0; | |
| int CurFile= -1; /* Index into FileStr table */ | |
| char *CurPredName=NULL; /* MR11 */ | |
| char *CurRule=NULL; /* Pointer to current rule name */ | |
| int CurRuleDebug=0; /* MR13 debug flag */ | |
| RuleEntry *CurRuleNode=NULL;/* Pointer to current rule node in syntax tree */ | |
| char *CurRetDef=NULL; /* Pointer to current return type definition */ | |
| char *CurParmDef=NULL; /* Pointer to current parameter definition */ | |
| Junction *CurRuleBlk=NULL; /* Pointer to current block node for enclosing block */ | |
| ListNode *CurExGroups=NULL; /* Current list of exception groups for rule/alts */ | |
| ListNode *CurElementLabels=NULL; | |
| ListNode *CurAstLabelsInActions=NULL; /* MR27 */ | |
| /* MR10 used by <<>>? to set "label_used_in_semantic_pred" */ | |
| /* MR10 this will force LT(i) assignment even in guess mode */ | |
| ListNode *CurActionLabels=NULL; /* MR10 Element Labels appearing in last action */ | |
| int numericActionLabel=0 ; /* MR10 << ... $1 ... >> or << ... $1 ... >>? */ | |
| ListNode *NumericPredLabels=NULL; /* MR10 << ... $1 ... >>? ONLY */ | |
| ListNode *ContextGuardPredicateList=NULL; /* MR13 for re-evaluating predicates | |
| after meta tokens are defined */ | |
| int CurBlockID=0; /* Unique int for each block */ | |
| int CurAltNum=0; | |
| Junction *CurAltStart = NULL; /* Junction node that starts the alt */ | |
| Junction *OuterAltStart = NULL; /* For chaining exception groups MR7 */ | |
| int NumRules=0; /* Rules are from 1 to n */ | |
| FILE *output=NULL; /* current parser output file */ | |
| FILE *input=NULL; /* current grammar input file */ | |
| char *FileStr[MaxNumFiles];/* Ptr to array of file names on command-line */ | |
| int NumFiles=0; /* current grammar file number */ | |
| #ifdef __cplusplus | |
| void (**fpTrans)(...), /* array of ptrs to funcs that translate nodes */ | |
| (**fpJTrans)(...); /* ... that translate junctions */ | |
| #else | |
| void (**fpTrans)(), /* array of ptrs to funcs that translate nodes */ | |
| (**fpJTrans)(); /* ... that translate junctions */ | |
| #endif | |
| int **FoStack; /* Array of LL_k ptrs to stacks of rule numbers */ | |
| int **FoTOS; /* FOLLOW stack top-of-stack pointers */ | |
| Junction *SynDiag = NULL; /* Pointer to start of syntax diagram */ | |
| int BlkLevel=1; /* Current block level. Set by antlr.g, used by | |
| * scanner to translate $i.j attributes */ | |
| set reserved_positions; /* set of token positions reserved by '#token T=i' cmds */ | |
| set all_tokens; /* set of all token types */ | |
| set imag_tokens; /* set of all imaginary token types (EpToken, errclasses...) */ | |
| set tokclasses; /* set of all token class token types */ | |
| ListNode *ForcedTokens = 0; /* list of token_id/token_num pairs to remap */ | |
| ListNode *MetaTokenNodes=NULL; /* list of meta token refs such as token classes etc... */ | |
| int *TokenInd=NULL; /* an indirection level between token num and position | |
| * of that token def in TokenStr and ExprStr */ | |
| int LastTokenCounted=0; /* ==TokenNum if no token renumbering (same as old TokenNum) */ | |
| int TokenNum=TokenStart; | |
| char **TokenStr=NULL; /* map token # to token name */ | |
| char **ExprStr=NULL; /* map token # to expr */ | |
| Junction **RulePtr=NULL; /* map rule # to RuleBlk node of rule */ | |
| ListNode *ExprOrder=NULL; /* list of exprs as they are found in grammar */ | |
| ListNode *BeforeActions=NULL;/* list of grammar actions before rules */ | |
| ListNode *AfterActions=NULL;/* list of grammar actions after rules */ | |
| ListNode *LexActions=NULL; /* list of lexical actions */ | |
| /* MR1 */ | |
| /* MR1 11-Apr-97 Provide mechanism for inserting code into DLG class */ | |
| /* MR1 via #lexmember <<....>> */ | |
| /* MR1 via #lexprefix <<....>> */ | |
| /* MR1 */ | |
| ListNode *LexMemberActions=NULL;/* list of lexical header member decl MR1 */ | |
| ListNode *LexPrefixActions=NULL;/* list of lexical header #include decl MR1 */ | |
| ListNode **Cycles=NULL; /* list of cycles (for each k) found when | |
| doing FOLLOWs */ | |
| ListNode *eclasses=NULL; /* list of error classes */ | |
| ListNode *tclasses=NULL; /* list of token classes */ | |
| LClass lclass[MaxLexClasses]; /* array of lex class definitions */ | |
| int CurrentLexClass; /* index into lclass */ | |
| int NumLexClasses=0; /* in range 1..MaxLexClasses (init 0) */ | |
| char *HdrAction=NULL; /* action defined with #header */ | |
| char *FirstAction=NULL; /* action defined with #first MR11 */ | |
| FILE *ErrFile; /* sets and error recovery stuff */ | |
| FILE *DefFile=NULL; /* list of tokens, return value structs, setwd defs */ | |
| FILE *MRinfoFile=NULL; /* MR10 information file */ | |
| int MRinfo=0; /* MR10 */ | |
| int MRinfoSeq=0; /* MR10 */ | |
| int InfoP=0; /* MR10 predicates */ | |
| int InfoT=0; /* MR10 tnodes */ | |
| int InfoF=0; /* MR10 first/follow sets */ | |
| int InfoM=0; /* MR10 monitor progress */ | |
| int InfoO=0; /* MR12 orphan rules */ | |
| int TnodesInUse=0; /* MR10 */ | |
| int TnodesPeak=0; /* MR10 */ | |
| int TnodesAllocated=0; /* MR10 */ | |
| int TnodesReportThreshold=0; /* MR11 */ | |
| int PotentialSuppression=0; /* MR10 */ | |
| int PotentialDummy=0; /* MR10 */ | |
| int CannotContinue=FALSE; | |
| int OutputLL_k = 1; /* LL_k for parsing must be power of 2 */ | |
| int action_file; /* used to track start of action */ | |
| int action_line; | |
| int FoundGuessBlk=0; /* there is a (...)? block somewhere in grammar */ | |
| int FoundException=0; /* there is an exception somewhere in grammar */ | |
| /* MR6 Distinguish between @ operator and real exception */ | |
| /* MR6 by keeping separate flags for @ operator and real exceptions */ | |
| int FoundAtOperator=0; /* MR6 */ | |
| int FoundExceptionGroup=0; /* MR6 */ | |
| int pLevel=0; /* print Level */ | |
| int pAlt1,pAlt2; /* print "==>" in front of these alts */ | |
| /* C++ output stuff */ | |
| FILE *Parser_h, /* where subclass of ANTLRParser goes */ | |
| *Parser_c; /* where code for subclass of ANTLRParser goes */ | |
| char Parser_h_Name[MaxFileName+1] = ""; | |
| char Parser_c_Name[MaxFileName+1] = ""; | |
| char MRinfoFile_Name[MaxFileName+1] = ""; /* MR10 */ | |
| char *ClassDeclStuff=NULL; /* MR10 */ | |
| char *BaseClassName=NULL; /* MR22 */ | |
| /* list of actions inside the #class {...} defs */ | |
| ListNode *class_before_actions=NULL; | |
| ListNode *class_after_actions=NULL; | |
| char CurrentClassName[MaxRuleName]=""; | |
| int no_classes_found=1; | |
| char *UserTokenDefsFile; | |
| int UserDefdTokens=0; /* found #tokdefs? */ | |
| char *OutputDirectory=TopDirectory; | |
| ExceptionGroup *DefaultExGroup = NULL; | |
| int NumSignals = NumPredefinedSignals; | |
| int ContextGuardTRAV=0; | |
| char *MR_AmbAidRule=NULL; /* MR11 */ | |
| int MR_AmbAidLine=0; /* MR11 */ | |
| int MR_AmbAidDepth=0; /* MR11 */ | |
| int MR_AmbAidMultiple=0; /* MR11 */ | |
| int MR_skipped_e3_report=0; /* MR11 */ | |
| int MR_usingPredNames=0; /* MR11 */ | |
| int MR_BadExprSets=0; /* MR13 */ | |
| int MR_Inhibit_Tokens_h_Gen=0; /* MR13 */ | |
| int NewAST=0; /* MR13 */ | |
| int tmakeInParser=0; /* MR23 */ | |
| int AlphaBetaTrace=0; /* MR14 */ | |
| int MR_BlkErr=0; /* MR21 */ | |
| int MR_AlphaBetaMessageCount=0; /* MR14 */ | |
| int MR_AlphaBetaWarning=0; /* MR14 */ | |
| int MR_ErrorSetComputationActive=0; /* MR14 */ | |
| int MR_MaintainBackTrace=0; /* MR14 */ | |
| set MR_CompromisedRules; /* MR14 */ | |
| Junction *MR_RuleBlkWithHalt; /* MR10 */ | |
| /* C m d - L i n e O p t i o n s */ | |
| int LL_k=1; /* how many tokens of full lookahead */ | |
| int CLL_k= -1; /* how many tokens of compressed lookahead */ | |
| int PrintOut = FALSE; /* print out the grammar */ | |
| int PrintAnnotate = FALSE;/* annotate printout with FIRST sets */ | |
| int CodeGen=TRUE; /* Generate output code? */ | |
| int LexGen=TRUE; /* Generate lexical files? (tokens.h, parser.dlg) */ | |
| int GenAST=FALSE; /* Generate AST's? */ | |
| int GenANSI=FALSE; /* Generate ANSI code where necessary */ | |
| int GenExprSetsOpt=TRUE;/* use sets not (LA(1)==tok) expression lists */ | |
| int GenCR=FALSE; /* Generate cross reference? */ | |
| int GenLineInfo=FALSE; /* Generate # line "file" stuff? */ | |
| int GenLineInfoMS=FALSE;/* Like -gl but replace "\" with "/" for MS C/C++ systems */ | |
| int TraceGen=FALSE; /* Generate code to trace rule invocation */ | |
| int elevel=1; /* error level for ambiguity messages */ | |
| int GenEClasseForRules=0;/* don't generate eclass for each rule */ | |
| int TreeResourceLimit= -1;/* don't limit tree resource */ | |
| int DemandLookahead = 0;/* demand/delayed lookahead or not */ | |
| char *RulePrefix = ""; /* prefix each generated rule with this */ | |
| char *stdpccts = "stdpccts.h";/* where to generate std pccts include file */ | |
| int GenStdPccts = 0; /* don't gen stdpccts.h? */ | |
| int ParseWithPredicates = 1; | |
| int WarningLevel = 1; | |
| int UseStdout = 0; /* MR6 */ | |
| int TabWidth = 2; /* MR6 */ /* MR27 */ | |
| int HoistPredicateContext = 0; | |
| int MRhoisting = 0; /* MR9 */ | |
| int MRhoistingk = 0; /* MR13 */ | |
| int MR_debugGenRule=0; /* MR11 */ | |
| int GenCC = 0; /* Generate C++ output */ | |
| PointerStack MR_BackTraceStack={0,0,NULL}; /* MR10 */ | |
| PointerStack MR_PredRuleRefStack={0,0,NULL}; /* MR10 */ | |
| PointerStack MR_RuleBlkWithHaltStack={0,0,NULL}; /* MR10 */ | |
| /* DontCopyTokens and Pragma_DupLabeledTokens were a bad idea. I've just | |
| turned them off rather than backpatching the code. Who knows? We | |
| may need them in the future. | |
| */ | |
| int DontCopyTokens = 1; /* in C++, don't copy ANTLRToken passed to ANTLR */ | |
| /* Remember if LT(i), LA(i), or LATEXT(i) used in an action which is not | |
| a predicate. If so, give a warning for novice users. | |
| */ | |
| int LTinTokenAction = 0; /* MR23 */ | |
| int PURIFY = 1; /* MR23 */ | |
| int CurBlockID_array[MAX_BLK_LEVEL]; /* MR23 */ | |
| int CurAltNum_array[MAX_BLK_LEVEL]; /* MR23 */ |