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

编译器/解释器

开发平台:

Others

  1. /*
  2.  * globals.c -- File containing all variables/tables visible to all files.
  3.  *
  4.  * SOFTWARE RIGHTS
  5.  *
  6.  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
  7.  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
  8.  * company may do whatever they wish with source code distributed with
  9.  * PCCTS or the code generated by PCCTS, including the incorporation of
  10.  * PCCTS, or its output, into commerical software.
  11.  *
  12.  * We encourage users to develop software with PCCTS.  However, we do ask
  13.  * that credit is given to us for developing PCCTS.  By "credit",
  14.  * we mean that if you incorporate our source code into one of your
  15.  * programs (commercial product, research project, or otherwise) that you
  16.  * acknowledge this fact somewhere in the documentation, research report,
  17.  * etc...  If you like PCCTS and have developed a nice tool with the
  18.  * output, please mention that you developed it using PCCTS.  In
  19.  * addition, we ask that this header remain intact in our source code.
  20.  * As long as these guidelines are kept, we expect to continue enhancing
  21.  * this system and expect to make other tools available as they are
  22.  * completed.
  23.  *
  24.  * ANTLR 1.33
  25.  * Terence Parr
  26.  * Parr Research Corporation
  27.  * with Purdue University and AHPCRC, University of Minnesota
  28.  * 1989-1998
  29.  */
  30. #include <stdio.h>
  31. #ifdef __cplusplus
  32. #ifndef __STDC__
  33. #define __STDC__
  34. #endif
  35. #endif
  36. #include "set.h"
  37. #include "syn.h"
  38. #include "hash.h"
  39. #include "generic.h"
  40. #include "pcctscfg.h"
  41. char Version[] = "1.33MR14" ; /* PCCTS version number */                    /* MRXXX */
  42. char VersionDef[] = "13314";  /* same (except int equiv for preproc symbol) */ /* MRXXX */
  43. char LexStartSymbol[] = "START";/* Name of starting lexical class/automaton */
  44. char *RemapFileName = "remap.h";
  45. char *DlgFileName = "parser.dlg";
  46. char *DefFileName = "tokens.h";
  47. char *ErrFileName = "err.c";
  48. char *ModeFileName = "mode.h";
  49. char *StdMsgName = NULL;
  50. char *ParserName = DefaultParserName;
  51. /* list of PCCTS supplied support symbols; these are renamed when more than
  52.  * one ANTLR-generated parsers are linked together to avoid name conflicts.
  53.  * Can't use '##' ANSIC preprocessor concat operator with K&R and:
  54.  * #define zzskip zzparser ## skip
  55.  * will not work for ANSI/C++ as 'zzparserskip' is created w/o zzparser
  56.  * being substituted--ack!!!
  57.  */
  58. char *StandardSymbols[] = {
  59. /* ANTLR stuff */
  60. "zzStackOvfMsg",
  61. "zzasp",
  62. "zzaStack",
  63. "inf_tokens",
  64. "inf_text",
  65. "inf_text_buffer",
  66. "inf_text_buffer_ptr",
  67. "inf_text_buffer_size",
  68.   "inf_labase",
  69. "inf_last",
  70. "inf_lap",
  71. "zztokenLA",
  72. "zztextLA",
  73. "zzlap",
  74. "zzlabase",
  75. "zztoktext",
  76. "zztoken",
  77. "zzdirty",
  78. "zzguessing",
  79. "zzguess_start",
  80. "zzresynch",
  81. "zzinf_tokens",
  82. "zzinf_text",
  83. "zzinf_text_buffer",
  84. "zzinf_labase",
  85. "zzinf_last",
  86. "zzfill_inf_look",
  87. "zzFAIL",
  88. "zzsave_antlr_state",
  89. "zzrestore_antlr_state",
  90. "zzsyn",
  91. "zzset_el",
  92. "zzset_deg",
  93. "zzedecode",
  94. "_zzsetmatch",
  95. "_zzmatch",
  96. "_inf_zzgettok",
  97.     "zzconsumeUntil",
  98.     "zzconsumeUntilToken",
  99.     "_zzmatch_wsig",
  100.     "_zzsetmatch_wsig",
  101.     "_zzmatch_wdfltsig",
  102.     "_zzsetmatch_wdfltsig",
  103. "zzdflthandlers",
  104. /* DLG stuff */
  105. "zzreal_line",
  106. "zzcharfull",
  107. "zzerr",
  108. "zzlextext",
  109. "zzbegexpr",
  110. "zzendexpr",
  111. "zzbufsize",
  112. "zzbegcol",
  113. "zzendcol",
  114. "zzline",
  115. "zzchar",
  116. "zzbufovf",
  117. "zzrdstream",
  118. "zzrdfunc",
  119. "zzrdstr",
  120. "zzclose_stream",
  121. "zzsave_dlg_state",
  122. "zzrestore_dlg_state",
  123. "zzmode",
  124. "zzskip",
  125. "zzmore",
  126. "zzreplchar",
  127. "zzreplstr",
  128. "zzgettok",
  129. "zzadvance",
  130. "zzerrstd",
  131. "zzerr_in",
  132. "zzconstr_attr",
  133. "zzempty_attr",
  134. "zzerraction",
  135. "zztokens", /* list of token regular expressions */
  136. "dfa",
  137. "accepts",
  138. "actions",
  139.     "zzTraceOptionValue",       /* MR10 */
  140.     "zzTraceGuessOptionValue",  /* MR10 */
  141.     "zzTraceCurrentRuleName",   /* MR10 */
  142.     "zzTraceDepth",             /* MR10 */
  143.     "zzGuessSeq",               /* MR10 */
  144.     "zzSyntaxErrCount",         /* MR11 */
  145.     "zzLexErrCount",            /* MR11 */
  146.     "zzTraceGuessDone",         /* MR13 - BJS */
  147.     "zzTraceGuessFail",         /* MR13 - BJS */
  148.     "zzTraceGuessOption",       /* MR13 - BJS */
  149.     "zzTraceIn",                /* MR13 - BJS */
  150.     "zzTraceOption",            /* MR13 - BJS */
  151.     "zzTraceOut",               /* MR13 - BJS */
  152.     "zzTraceReset",             /* MR13 - BJS */
  153. NULL /* must be present */
  154. };
  155. /* list of PCCTS supplied support functions; these are renamed when more than
  156.  * one ANTLR-generated parsers are linked together to avoid name conflicts.
  157.  */
  158. char *ASTSymbols[] = {
  159. "AST",
  160. "zzast_sp",
  161. "zzastStack",
  162. "zzlink",
  163. "zzastnew",
  164. "zzsubchild",
  165. "zzsubroot",
  166. "zzpre_ast",
  167. "zzfree_ast",
  168. "zztmake",
  169. "zzdup_ast",
  170. "zztfree",
  171. "zzdouble_link",
  172. NULL /* must be present */
  173. };
  174. /* Current ambiguity examination information */
  175. int CurAmbigAlt1, CurAmbigAlt2, CurAmbigline, CurAmbigfile;
  176. char *CurAmbigbtype;
  177. /* M e t h o d  T a b l e s */
  178. /*
  179.  * The following tables are used to fill syntax diagram nodes with the correct
  180.  * function pointers for computing FIRST sets and printing themselves.
  181.  */
  182. /* fpTraverse[node type] == pointer to function that calculates trees
  183.  * representing the FIRST sets for that node (maintains spatial info).
  184.  * We use 'struct _tree' not 'tree' due to a g++ 2.4.3 bug.
  185.  */
  186. #ifdef __cplusplus
  187. struct _tree *(*fpTraverse[NumNodeTypes+1])(... /* Node *, int, set * */) = {
  188. NULL,
  189. (struct _tree *(*)(...)) tJunc,
  190. (struct _tree *(*)(...)) tRuleRef,
  191. (struct _tree *(*)(...)) tToken,
  192. (struct _tree *(*)(...)) tAction
  193. };
  194. #else
  195. Tree *(*fpTraverse[NumNodeTypes+1])() = {
  196. NULL,
  197. tJunc,
  198. tRuleRef,
  199. tToken,
  200. tAction
  201. };
  202. #endif
  203. /* fpReach[node type] == pointer to function that calculates FIRST set for
  204.  * that node. (r stands for reach).  We use 'struct _set' not 'set'
  205.  * due to a g++ 2.4.3 bug.
  206.  */
  207. #ifdef __cplusplus
  208. struct _set (*fpReach[NumNodeTypes+1])(... /* Node *, int, set * */) = {
  209. NULL,
  210. (struct _set (*)(...)) rJunc,
  211. (struct _set (*)(...)) rRuleRef,
  212. (struct _set (*)(...)) rToken,
  213. (struct _set (*)(...)) rAction
  214. };
  215. #else
  216. set (*fpReach[NumNodeTypes+1])() = {
  217. NULL,
  218. rJunc,
  219. rRuleRef,
  220. rToken,
  221. rAction
  222. };
  223. #endif
  224. /* fpPrint[node type] == pointer to function that knows how to print that node. */
  225. #ifdef __cplusplus
  226. void (*fpPrint[NumNodeTypes+1])(... /* Node * */) = {
  227. NULL,
  228. (void (*)(...)) pJunc,
  229. (void (*)(...)) pRuleRef,
  230. (void (*)(...)) pToken,
  231. (void (*)(...)) pAction
  232. };
  233. #else
  234. void (*fpPrint[NumNodeTypes+1])() = {
  235. NULL,
  236. pJunc,
  237. pRuleRef,
  238. pToken,
  239. pAction
  240. };
  241. #endif
  242. char *decodeJType[] = {
  243. "invalid",
  244. "aSubBlk",
  245. "aOptBlk",
  246. "aLoopBlk",
  247. "EndBlk",
  248. "RuleBlk",
  249. "Generic",
  250. "EndRule",
  251. "aPlusBlk",
  252. "aLoopBegin"
  253. };
  254. /* H a s h  T a b l e s */
  255. Entry **Tname, /* Table of all token names (maps name to tok num)*/
  256. **Texpr, /* Table of all token expressions
  257.    (maps expr to tok num) */
  258. **Rname, /* Table of all Rules (has ptr to start of rule) */
  259. **Fcache, /* Cache of First/Follow Computations */
  260. **Tcache; /* Tree cache; First/Follow for permute trees */
  261. Entry **Elabel; /* Table of all element label names */
  262. Entry **Sname; /* Signal names */
  263. Entry   **Pname;            /* symbolic predicate names MR11 */
  264. /* V a r i a b l e s */
  265. int     Save_argc;          /* MR10 */
  266. char    **Save_argv;        /* MR10 */
  267. int EpToken=0; /* Imaginary Epsilon token number */
  268. int WildCardToken=0;
  269. int CurFile= -1; /* Index into FileStr table */
  270. char    *CurPredName=NULL;  /* MR11 */
  271. char *CurRule=NULL; /* Pointer to current rule name */
  272. int     CurRuleDebug=0;     /* MR13 debug flag */
  273. RuleEntry *CurRuleNode=NULL;/* Pointer to current rule node in syntax tree */
  274. char *CurRetDef=NULL; /* Pointer to current return type definition */
  275. char *CurParmDef=NULL; /* Pointer to current parameter definition */
  276. Junction *CurRuleBlk=NULL; /* Pointer to current block node for enclosing block */
  277. ListNode *CurExGroups=NULL; /* Current list of exception groups for rule/alts */
  278. ListNode *CurElementLabels=NULL;
  279. /* MR10  used by <<>>? to set "label_used_in_semantic_pred"  */
  280. /* MR10  this will force LT(i) assignment even in guess mode */
  281. ListNode *CurActionLabels=NULL;     /* MR10 Element Labels appearing in last action */
  282. int      numericActionLabel=0 ;     /* MR10 << ... $1 ... >> or << ... $1 ... >>?   */
  283. ListNode *NumericPredLabels=NULL;   /* MR10 << ... $1 ... >>?  ONLY                 */
  284. ListNode *ContextGuardPredicateList=NULL;  /* MR13 for re-evaluating predicates
  285.                                                    after meta tokens are defined    */
  286. int CurBlockID=0; /* Unique int for each block */
  287. int CurAltNum=0;
  288. Junction *CurAltStart = NULL; /* Junction node that starts the alt */
  289. Junction *OuterAltStart = NULL; /* For chaining exception groups        MR7 */
  290. int NumRules=0; /* Rules are from 1 to n */
  291. FILE *output=NULL; /* current parser output file */
  292. FILE *input=NULL; /* current grammar input file */
  293. char *FileStr[MaxNumFiles];/* Ptr to array of file names on command-line */
  294. int NumFiles=0; /* current grammar file number */
  295. #ifdef __cplusplus
  296. void (**fpTrans)(...), /* array of ptrs to funcs that translate nodes */
  297.   (**fpJTrans)(...); /*  ... that translate junctions */
  298. #else
  299. void (**fpTrans)(), /* array of ptrs to funcs that translate nodes */
  300.   (**fpJTrans)(); /*  ... that translate junctions */
  301. #endif
  302. int **FoStack; /* Array of LL_k ptrs to stacks of rule numbers */
  303. int **FoTOS; /* FOLLOW stack top-of-stack pointers */
  304. Junction *SynDiag = NULL; /* Pointer to start of syntax diagram */
  305. int BlkLevel=1; /* Current block level.  Set by antlr.g, used by
  306.  * scanner to translate $i.j attributes */
  307. set reserved_positions; /* set of token positions reserved by '#token T=i' cmds */
  308. set all_tokens; /* set of all token types */
  309. set imag_tokens; /* set of all imaginary token types (EpToken, errclasses...) */
  310. set tokclasses; /* set of all token class token types */
  311. ListNode *ForcedTokens = 0; /* list of token_id/token_num pairs to remap */
  312. ListNode *MetaTokenNodes=NULL; /* list of meta token refs such as token classes etc... */
  313. int *TokenInd=NULL; /* an indirection level between token num and position
  314.  * of that token def in TokenStr and ExprStr */
  315. int LastTokenCounted=0; /* ==TokenNum if no token renumbering (same as old TokenNum) */
  316. int TokenNum=TokenStart;
  317. char **TokenStr=NULL; /* map token # to token name */
  318. char **ExprStr=NULL; /* map token # to expr */
  319. Junction **RulePtr=NULL; /* map rule # to RuleBlk node of rule */
  320. ListNode *ExprOrder=NULL; /* list of exprs as they are found in grammar */
  321. ListNode *BeforeActions=NULL;/* list of grammar actions before rules */
  322. ListNode *AfterActions=NULL;/* list of grammar actions after rules */
  323. ListNode *LexActions=NULL; /* list of lexical actions */
  324. /* MR1                   */
  325. /* MR1  11-Apr-97 Provide mechanism for inserting code into DLG class     */
  326. /* MR1 via #lexmember <<....>>             */
  327. /* MR1 via #lexprefix <<....>>             */
  328. /* MR1                      */
  329. ListNode *LexMemberActions=NULL;/* list of lexical header member decl   MR1 */
  330. ListNode *LexPrefixActions=NULL;/* list of lexical header #include decl MR1 */
  331. ListNode **Cycles=NULL; /* list of cycles (for each k) found when
  332.    doing FOLLOWs */
  333. ListNode *eclasses=NULL; /* list of error classes */
  334. ListNode *tclasses=NULL; /* list of token classes */
  335. LClass  lclass[MaxLexClasses]; /* array of lex class definitions */
  336. int  CurrentLexClass; /* index into lclass */
  337. int  NumLexClasses=0; /* in range 1..MaxLexClasses (init 0) */
  338. char *HdrAction=NULL; /* action defined with #header */
  339. char    *FirstAction=NULL;  /* action defined with #first MR11 */
  340. FILE *ErrFile; /* sets and error recovery stuff */
  341. FILE *DefFile=NULL; /* list of tokens, return value structs, setwd defs */
  342. FILE    *MRinfoFile=NULL;   /* MR10 information file */
  343. int     MRinfo=0;           /* MR10 */
  344. int     MRinfoSeq=0;        /* MR10 */
  345. int     InfoP=0;            /* MR10 predicates        */
  346. int     InfoT=0;            /* MR10 tnodes            */
  347. int     InfoF=0;            /* MR10 first/follow sets */
  348. int     InfoM=0;            /* MR10 monitor progress  */
  349. int     InfoO=0;            /* MR12 orphan rules      */
  350. int     TnodesInUse=0;      /* MR10 */
  351. int     TnodesPeak=0;       /* MR10 */
  352. int     TnodesAllocated=0;  /* MR10 */
  353. int     TnodesReportThreshold=0;    /* MR11 */
  354. int     PotentialSuppression=0; /* MR10 */
  355. int     PotentialDummy=0;       /* MR10 */
  356. int CannotContinue=FALSE;
  357. int OutputLL_k = 1; /* LL_k for parsing must be power of 2 */
  358. int action_file; /* used to track start of action */
  359. int action_line;
  360. int FoundGuessBlk=0; /* there is a (...)? block somewhere in grammar */
  361. int FoundException=0; /* there is an exception somewhere in grammar */
  362. /* MR6 Distinguish between @ operator and real exception      */
  363. /* MR6    by keeping separate flags for @ operator and real exceptions      */
  364. int FoundAtOperator=0;                      /* MR6 */
  365. int FoundExceptionGroup=0;                              /* MR6 */
  366. int pLevel=0; /* print Level */
  367. int pAlt1,pAlt2; /* print "==>" in front of these alts */
  368. /* C++ output stuff */
  369. FILE *Parser_h, /* where subclass of ANTLRParser goes */
  370. *Parser_c; /* where code for subclass of ANTLRParser goes */
  371. char Parser_h_Name[MaxFileName+1] = "";
  372. char Parser_c_Name[MaxFileName+1] = "";
  373. char    MRinfoFile_Name[MaxFileName+1] = "";                /* MR10 */
  374. char    *ClassDeclStuff=NULL;                               /* MR10 */
  375. /* list of actions inside the #class {...} defs */
  376. ListNode *class_before_actions=NULL;
  377. ListNode *class_after_actions=NULL;
  378. char CurrentClassName[MaxRuleName]="";
  379. int no_classes_found=1;
  380. char *UserTokenDefsFile;
  381. int UserDefdTokens=0; /* found #tokdefs? */
  382. char *OutputDirectory=TopDirectory;
  383. ExceptionGroup *DefaultExGroup = NULL;
  384. int NumSignals = NumPredefinedSignals;
  385. int ContextGuardTRAV=0;
  386. char    *MR_AmbAidRule=NULL;        /* MR11 */
  387. int     MR_AmbAidLine=0;            /* MR11 */
  388. int     MR_AmbAidDepth=0;           /* MR11 */
  389. int     MR_AmbAidMultiple=0;        /* MR11 */
  390. int     MR_skipped_e3_report=0;     /* MR11 */
  391. int     MR_usingPredNames=0;        /* MR11 */
  392. int     MR_BadExprSets=0;           /* MR13 */
  393. int     MR_Inhibit_Tokens_h_Gen=0;  /* MR13 */
  394. int     NewAST=0;                   /* MR13 */
  395. int     AlphaBetaTrace=0;           /* MR14 */
  396. int     MR_AlphaBetaMessageCount=0; /* MR14 */
  397. int     MR_AlphaBetaWarning=0;      /* MR14 */
  398. int     MR_ErrorSetComputationActive=0;     /* MR14 */
  399. int     MR_MaintainBackTrace=0;             /* MR14 */
  400. set     MR_CompromisedRules;        /* MR14 */
  401. Junction    *MR_RuleBlkWithHalt;    /* MR10 */
  402. /* C m d - L i n e  O p t i o n s */
  403. int LL_k=1; /* how many tokens of full lookahead */
  404. int CLL_k= -1; /* how many tokens of compressed lookahead */
  405. int PrintOut = FALSE; /* print out the grammar */
  406. int PrintAnnotate = FALSE;/* annotate printout with FIRST sets */
  407. int CodeGen=TRUE; /* Generate output code? */
  408. int LexGen=TRUE; /* Generate lexical files? (tokens.h, parser.dlg) */
  409. int GenAST=FALSE; /* Generate AST's? */
  410. int GenANSI=FALSE; /* Generate ANSI code where necessary */
  411. int GenExprSetsOpt=TRUE;/* use sets not (LA(1)==tok) expression lists */
  412. int GenCR=FALSE; /* Generate cross reference? */
  413. int GenLineInfo=FALSE; /* Generate # line "file" stuff? */
  414. int GenLineInfoMS=FALSE;/* Like -gl but replace "" with "/" for MS C/C++ systems */
  415. int TraceGen=FALSE; /* Generate code to trace rule invocation */
  416. int elevel=1; /* error level for ambiguity messages */
  417. int GenEClasseForRules=0;/* don't generate eclass for each rule */
  418. int TreeResourceLimit= -1;/* don't limit tree resource */
  419. int DemandLookahead = 0;/* demand/delayed lookahead or not */
  420. char *RulePrefix = ""; /* prefix each generated rule with this */
  421. char *stdpccts = "stdpccts.h";/* where to generate std pccts include file */
  422. int GenStdPccts = 0; /* don't gen stdpccts.h? */
  423. int ParseWithPredicates = 1;
  424. int WarningLevel = 1;
  425. int UseStdout = 0; /* MR6 */
  426. int TabWidth = 0; /* MR6 */
  427. int HoistPredicateContext = 0;
  428. int     MRhoisting = 0;                 /* MR9 */
  429. int     MRhoistingk = 0;                /* MR13 */
  430. int     MR_debugGenRule=0;              /* MR11 */
  431. int GenCC = 0; /* Generate C++ output */
  432. PointerStack MR_BackTraceStack={0,0,NULL};            /* MR10 */
  433. PointerStack MR_PredRuleRefStack={0,0,NULL};          /* MR10 */
  434. PointerStack MR_RuleBlkWithHaltStack={0,0,NULL};      /* MR10 */
  435. /* DontCopyTokens and Pragma_DupLabeledTokens were a bad idea.  I've just
  436.    turned them off rather than backpatching the code.  Who knows?  We
  437.    may need them in the future.
  438.  */
  439. int DontCopyTokens = 1; /* in C++, don't copy ANTLRToken passed to ANTLR */