]> pd.if.org Git - pccts/blobdiff - antlr/globals.c
auto commit for import
[pccts] / antlr / globals.c
diff --git a/antlr/globals.c b/antlr/globals.c
new file mode 100755 (executable)
index 0000000..8795fd9
--- /dev/null
@@ -0,0 +1,386 @@
+/*
+ * globals.c   --      File containing all variables/tables visible to all files.
+ *
+ * $Id: globals.c,v 1.5 95/10/05 11:57:02 parrt Exp $
+ * $Revision: 1.5 $
+ *
+ * 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-1995
+ */
+#include <stdio.h>
+#ifdef __cplusplus
+#ifndef __STDC__
+#define __STDC__
+#endif
+#endif
+#include "set.h"
+#include "syn.h"
+#include "hash.h"
+#include "generic.h"
+
+char Version[] = "1.33" ;      /* PCCTS version number */
+char VersionDef[] = "133";  /* same (except int equiv for preproc symbol) */
+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 *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",
+       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 */
+
+
+                                                       /* V a r i a b l e s */
+
+int            EpToken=0;                      /* Imaginary Epsilon token number */
+int            WildCardToken=0;
+int            CurFile= -1;            /* Index into FileStr table */
+char   *CurRule=NULL;          /* Pointer to current rule name */
+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;
+int            CurBlockID=0;           /* Unique int for each block */
+int            CurAltNum=0;
+Junction *CurAltStart = NULL;  /* Junction node that starts the alt */
+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 */
+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 */
+FILE   *ErrFile;                       /* sets and error recovery stuff */
+FILE   *DefFile=NULL;          /* list of tokens, return value structs, setwd defs */
+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 */
+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] = "";
+
+/* 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;
+
+
+                                       /* 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            GenExprSets=TRUE;       /* use sets not (LA(1)==tok) expression lists */
+int            GenCR=FALSE;            /* Generate cross reference? */
+int            GenLineInfo=FALSE;      /* Generate # line "file" stuff? */
+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            HoistPredicateContext = 0;
+int            GenCC = 0;                      /* Generate C++ output */
+
+/* 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 */