home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pccts.zip / pccts / antlr / globals.c < prev    next >
C/C++ Source or Header  |  1994-03-31  |  11KB  |  356 lines

  1. /*
  2.  * globals.c    --    File containing all variables/tables visible to all files.
  3.  *
  4.  * $Id: globals.c,v 1.5 1994/03/25 19:40:05 parrt Exp parrt $
  5.  * $Revision: 1.5 $
  6.  *
  7.  * SOFTWARE RIGHTS
  8.  *
  9.  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
  10.  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
  11.  * company may do whatever they wish with source code distributed with
  12.  * PCCTS or the code generated by PCCTS, including the incorporation of
  13.  * PCCTS, or its output, into commerical software.
  14.  * 
  15.  * We encourage users to develop software with PCCTS.  However, we do ask
  16.  * that credit is given to us for developing PCCTS.  By "credit",
  17.  * we mean that if you incorporate our source code into one of your
  18.  * programs (commercial product, research project, or otherwise) that you
  19.  * acknowledge this fact somewhere in the documentation, research report,
  20.  * etc...  If you like PCCTS and have developed a nice tool with the
  21.  * output, please mention that you developed it using PCCTS.  In
  22.  * addition, we ask that this header remain intact in our source code.
  23.  * As long as these guidelines are kept, we expect to continue enhancing
  24.  * this system and expect to make other tools available as they are
  25.  * completed.
  26.  *
  27.  * Version 1.20
  28.  * Terence Parr
  29.  * Purdue University
  30.  * With AHPCRC, University of Minnesota
  31.  * 1989-1994
  32.  */
  33. #include <stdio.h>
  34. #ifdef __cplusplus
  35. #ifndef __STDC__
  36. #define __STDC__
  37. #endif
  38. #endif
  39. #include "set.h"
  40. #include "syn.h"
  41. #include "hash.h"
  42. #include "generic.h"
  43.  
  44. char Version[] = "1.20";    /* PCCTS version number */
  45. char VersionDef[] = "120";    /* same (except int equiv for preproc symbol) */
  46. char LexStartSymbol[] = "START";/* Name of starting lexical class/automaton */
  47.  
  48. char *RemapFileName = "remap.h";
  49. char *DlgFileName = "parser.dlg";
  50. char *DefFileName = "tokens.h";
  51. char *ErrFileName = "err.c";
  52. char *ModeFileName = "mode.h";
  53.  
  54. char *ParserName = DefaultParserName;
  55.  
  56. /* list of PCCTS supplied support symbols; these are renamed when more than
  57.  * one ANTLR-generated parsers are linked together to avoid name conflicts.
  58.  * Can't use '##' ANSIC preprocessor concat operator with K&R and:
  59.  *        #define zzskip    zzparser ## skip
  60.  * will not work for ANSI/C++ as 'zzparserskip' is created w/o zzparser
  61.  * being substituted--ack!!!
  62.  */
  63. char *StandardSymbols[] = {
  64. /* ANTLR stuff */
  65.     "zzStackOvfMsg",
  66.     "zzasp",
  67.     "zzaStack",
  68.     "inf_tokens",
  69.     "inf_text",
  70.     "inf_text_buffer",
  71.     "inf_text_buffer_ptr",
  72.     "inf_text_buffer_size",
  73.      "inf_labase",
  74.     "inf_last",
  75.     "inf_lap",
  76.     "zztokenLA",
  77.     "zztextLA",
  78.     "zzlap",
  79.     "zzlabase",
  80.     "zztoktext",
  81.     "zztoken",
  82.     "zzdirty",
  83.     "zzguessing",
  84.     "zzguess_start",
  85.     "zzresynch",
  86.     "zzinf_tokens",
  87.     "zzinf_text",
  88.     "zzinf_text_buffer",
  89.     "zzinf_labase",
  90.     "zzinf_last",
  91.     "zzfill_inf_look",
  92.     "zzFAIL",
  93.     "zzsave_antlr_state",
  94.     "zzrestore_antlr_state",
  95.     "zzsyn",
  96.     "zzset_el",
  97.     "zzset_deg",
  98.     "zzedecode",
  99.     "_zzsetmatch",
  100.     "_zzmatch",
  101.     "_inf_zzgettok",
  102. /* DLG stuff */
  103.     "zzcharfull",
  104.     "zzerr",
  105.     "zzlextext",
  106.     "zzbegexpr",
  107.     "zzendexpr",
  108.     "zzbufsize",
  109.     "zzbegcol",
  110.     "zzendcol",
  111.     "zzline",
  112.     "zzchar",
  113.     "zzbufovf",
  114.     "zzrdstream",
  115.     "zzrdfunc",
  116.     "zzrdstr",
  117.     "zzclose_stream",
  118.     "zzsave_dlg_state",
  119.     "zzrestore_dlg_state",
  120.     "zzmode",
  121.     "zzskip",
  122.     "zzmore",
  123.     "zzreplchar",
  124.     "zzreplstr",
  125.     "zzgettok",
  126.     "zzadvance",
  127.     "zzerrstd",
  128.     "zzerr_in",
  129.     "zzconstr_attr",
  130.     "zzempty_attr",
  131.     "zzerraction",
  132.     "zztokens",            /* list of token regular expressions */
  133.     "dfa",
  134.     "accepts",
  135.     "actions",
  136.     NULL        /* must be present */
  137. };
  138.  
  139. /* list of PCCTS supplied support functions; these are renamed when more than
  140.  * one ANTLR-generated parsers are linked together to avoid name conflicts.
  141.  */
  142. char *ASTSymbols[] = {
  143.     "AST",
  144.     "zzast_sp",
  145.     "zzastStack",
  146.     "zzlink",
  147.     "zzastnew",
  148.     "zzsubchild",
  149.     "zzsubroot",
  150.     "zzpre_ast",
  151.     "zzfree_ast",
  152.     "zztmake",
  153.     "zzdup_ast",
  154.     "zztfree",
  155.     "zzdouble_link",
  156.     NULL        /* must be present */
  157. };
  158.  
  159. /* Current ambiguity examination information */
  160. int CurAmbigAlt1, CurAmbigAlt2, CurAmbigline, CurAmbigfile;
  161. char *CurAmbigbtype;
  162.  
  163.  
  164.                         /* M e t h o d  T a b l e s */
  165. /*
  166.  * The following tables are used to fill syntax diagram nodes with the correct
  167.  * function pointers for computing FIRST sets and printing themselves.
  168.  */
  169.  
  170. /* fpTraverse[node type] == pointer to function that calculates trees
  171.  * representing the FIRST sets for that node (maintains spatial info).
  172.  * We use 'struct _tree' not 'tree' due to a g++ 2.4.3 bug.
  173.  */
  174. #ifdef __cplusplus
  175. struct _tree *(*fpTraverse[NumNodeTypes+1])(... /* Node *, int, set * */) = {
  176.     NULL,
  177.     (struct _tree *(*)(...)) tJunc,
  178.     (struct _tree *(*)(...)) tRuleRef,
  179.     (struct _tree *(*)(...)) tToken,
  180.     (struct _tree *(*)(...)) tAction
  181. };
  182. #else
  183. Tree *(*fpTraverse[NumNodeTypes+1])() = {
  184.     NULL,
  185.     tJunc,
  186.     tRuleRef,
  187.     tToken,
  188.     tAction
  189. };
  190. #endif
  191.  
  192. /* fpReach[node type] == pointer to function that calculates FIRST set for
  193.  * that node. (r stands for reach).  We use 'struct _set' not 'set'
  194.  * due to a g++ 2.4.3 bug.
  195.  */
  196. #ifdef __cplusplus
  197. struct _set (*fpReach[NumNodeTypes+1])(... /* Node *, int, set * */) = {
  198.     NULL,
  199.     (struct _set (*)(...)) rJunc,
  200.     (struct _set (*)(...)) rRuleRef,
  201.     (struct _set (*)(...)) rToken,
  202.     (struct _set (*)(...)) rAction
  203. };
  204. #else
  205. set (*fpReach[NumNodeTypes+1])() = {
  206.     NULL,
  207.     rJunc,
  208.     rRuleRef,
  209.     rToken,
  210.     rAction
  211. };
  212. #endif
  213.  
  214. /* fpPrint[node type] == pointer to function that knows how to print that node. */
  215. #ifdef __cplusplus
  216. void (*fpPrint[NumNodeTypes+1])(... /* Node * */) = {
  217.     NULL,
  218.     (void (*)(...)) pJunc,
  219.     (void (*)(...)) pRuleRef,
  220.     (void (*)(...)) pToken,
  221.     (void (*)(...)) pAction
  222. };
  223. #else
  224. void (*fpPrint[NumNodeTypes+1])() = {
  225.     NULL,
  226.     pJunc,
  227.     pRuleRef,
  228.     pToken,
  229.     pAction
  230. };
  231. #endif
  232.  
  233. char *decodeJType[] = {
  234.     "invalid",
  235.     "aSubBlk",
  236.     "aOptBlk",
  237.     "aLoopBlk",
  238.     "EndBlk",
  239.     "RuleBlk",
  240.     "Generic",
  241.     "EndRule",
  242.     "aPlusBlk",
  243.     "aLoopBegin"
  244. };
  245.  
  246.  
  247.                             /* H a s h  T a b l e s */
  248.  
  249. Entry    **Tname,            /* Table of all token names (maps name to tok num)*/
  250.         **Texpr,            /* Table of all token expressions
  251.                                (maps expr to tok num) */
  252.         **Rname,            /* Table of all Rules (has ptr to start of rule) */
  253.         **Fcache,            /* Cache of First/Follow Computations */
  254.         **Tcache;            /* Tree cache; First/Follow for permute trees */
  255.  
  256.  
  257.                             /* V a r i a b l e s */
  258.  
  259. int        EpToken=0;            /* Imaginary Epsilon token number */
  260. int        CurFile= -1;        /* Index into FileStr table */
  261. char    *CurRule=NULL;        /* Pointer to current rule name */
  262. RuleEntry *CurRuleNode=NULL;/* Pointer to current rule node in syntax tree */
  263. char    *CurRetDef=NULL;    /* Pointer to current return type definition */
  264. char    *CurParmDef=NULL;    /* Pointer to current parameter definition */
  265. int        NumRules=0;            /* Rules are from 1 to n */
  266. FILE    *output=NULL;        /* current parser output file */
  267. FILE    *input=NULL;        /* current grammar input file */
  268. char    *FileStr[MaxNumFiles];/* Ptr to array of file names on command-line */
  269. int        NumFiles=0;            /* current grammar file number */
  270. #ifdef __cplusplus
  271. void    (**fpTrans)(...),    /* array of ptrs to funcs that translate nodes */
  272.          (**fpJTrans)(...);    /*  ... that translate junctions */
  273. #else
  274. void    (**fpTrans)(),        /* array of ptrs to funcs that translate nodes */
  275.          (**fpJTrans)();        /*  ... that translate junctions */
  276. #endif
  277. int        **FoStack;            /* Array of LL_k ptrs to stacks of rule numbers */
  278. int        **FoTOS;            /* FOLLOW stack top-of-stack pointers */
  279. Junction *SynDiag = NULL;    /* Pointer to start of syntax diagram */
  280. int        BlkLevel=1;            /* Current block level.  Set by antlr.g, used by
  281.                              * scanner to translate $i.j attributes */
  282. set        reserved_positions;    /* set of token positions reserved by '#token T=i' cmds */
  283. set        all_tokens;            /* set of all token types */
  284. set        imag_tokens;        /* set of all imaginary token types (EpToken, errclasses...) */
  285. ListNode *ForcedTokens = 0;    /* list of token_id/token_num pairs to remap */
  286. ListNode *MetaTokenNodes=NULL; /* list of meta token refs such as token classes etc... */
  287. int        *TokenInd=NULL;        /* an indirection level between token num and position
  288.                              * of that token def in TokenStr and ExprStr */
  289. int        LastTokenCounted=0;    /* ==TokenNum if no token renumbering (same as old TokenNum) */
  290. int        TokenNum=TokenStart;
  291. char    **TokenStr=NULL;    /* map token # to token name */
  292. char    **ExprStr=NULL;        /* map token # to expr */
  293. Junction **RulePtr=NULL;    /* map rule # to RuleBlk node of rule */
  294. ListNode *ExprOrder=NULL;    /* list of exprs as they are found in grammar */
  295. ListNode *BeforeActions=NULL;/* list of grammar actions before rules */
  296. ListNode *AfterActions=NULL;/* list of grammar actions after rules */
  297. ListNode *LexActions=NULL;    /* list of lexical actions */
  298. ListNode **Cycles=NULL;        /* list of cycles (for each k) found when
  299.                                doing FOLLOWs */
  300. ListNode *eclasses=NULL;    /* list of error classes */
  301. ListNode *tclasses=NULL;    /* list of token classes */
  302. LClass     lclass[MaxLexClasses]; /* array of lex class definitions */
  303. int         CurrentLexClass;    /* index into lclass */
  304. int         NumLexClasses=0;    /* in range 1..MaxLexClasses (init 0) */
  305.  
  306. char    *HdrAction=NULL;    /* action defined with #header */
  307. FILE    *ErrFile;            /* sets and error recovery stuff */
  308. FILE    *DefFile=NULL;        /* list of tokens, return value structs, setwd defs */
  309. int        CannotContinue=FALSE;
  310. int        OutputLL_k = 1;        /* LL_k for parsing must be power of 2 */
  311. int        action_file;        /* used to track start of action */
  312. int        action_line;
  313. int        FoundGuessBlk=0;    /* there is a (...)? block somewhere in grammar */
  314. int        pLevel=0;            /* print Level */
  315. int        pAlt1,pAlt2;        /* print "==>" in front of these alts */
  316.  
  317. /* C++ output stuff */
  318. FILE    *Parser_h,            /* where subclass of ANTLRParser goes */
  319.         *Parser_c;            /* where code for subclass of ANTLRParser goes */
  320. char    Parser_h_Name[MaxFileName+1] = "";
  321. char    Parser_c_Name[MaxFileName+1] = "";
  322. ListNode *class_actions=NULL;/* list of actions inside the #class {...} defs */
  323. char    CurrentClassName[MaxRuleName]="";
  324. int        no_classes_found=1;
  325. char    *UserTokenDefsFile;
  326. int        UserDefdTokens=0;    /* found #tokdefs? */
  327. char    *OutputDirectory=".";
  328.  
  329.  
  330.                     /* C m d - L i n e  O p t i o n s */
  331.  
  332. int        LL_k=1;                /* how many tokens of full lookahead */
  333. int        CLL_k= -1;            /* how many tokens of compressed lookahead */
  334. int        PrintOut = FALSE;    /* print out the grammar */
  335. int        PrintAnnotate = FALSE;/* annotate printout with FIRST sets */
  336. int        CodeGen=TRUE;        /* Generate output code? */
  337. int        LexGen=TRUE;        /* Generate lexical files? (tokens.h, parser.dlg) */
  338. int        GenAST=FALSE;        /* Generate AST's? */
  339. int        GenANSI=FALSE;        /* Generate ANSI code where necessary */
  340. int        GenExprSets=TRUE;    /* use sets not (LA(1)==tok) expression lists */
  341. int        GenCR=FALSE;        /* Generate cross reference? */
  342. int        GenLineInfo=FALSE;    /* Generate # line "file" stuff? */
  343. int        TraceGen=FALSE;        /* Generate code to trace rule invocation */
  344. int        elevel=1;            /* error level for ambiguity messages */
  345. int        GenEClasseForRules=0;/* don't generate eclass for each rule */
  346. int        TreeResourceLimit= -1;/* don't limit tree resource */
  347. int        DemandLookahead = 0;/* demand/delayed lookahead or not */
  348. char    *RulePrefix = "";    /* prefix each generated rule with this */
  349. char    *stdpccts = "stdpccts.h";/* where to generate std pccts include file */
  350. int        GenStdPccts = 0;    /* don't gen stdpccts.h? */
  351. int        ParseWithPredicates = 1;
  352. int        WarningLevel = 1;
  353. int        HoistPredicateContext = 0;
  354. int        GenCC = 0;            /* Generate C++ output */
  355. int        DontCopyTokens = 0;    /* in C++ don't copy ANTLRToken passed to ANTLR */
  356.