Annotation of coherent/b/bin/yacc/yacc.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * COCOA structure definitions
        !             3:  *
        !             4:  * This parser generator is dedicated to Reinaldo Braga.
        !             5:  * May he live a hundred years
        !             6:  */
        !             7: /*
        !             8:  * Modified by nigel to eliminate ill-advised use of "flex-arrays" in the
        !             9:  * data structures, eliminate use of '%r' in yyerror (), and to use <limits.h>
        !            10:  * rather than magic internal definitions. Other than that, I had nothing to
        !            11:  * do with this garbage.
        !            12:  */
        !            13: #include <stdio.h>
        !            14: #include <limits.h>
        !            15: 
        !            16: enum {
        !            17:        FATAL           = 1,    /* flag for yyerror */
        !            18:        SKIP,                   /* ditto */
        !            19:        NLNO,                   /* no line number on error line */
        !            20:        WARNING
        !            21: };
        !            22: 
        !            23: enum {
        !            24:        TTERM           = 0,    /* "genre" for token */
        !            25:        TNTERM,                 /* non-terminal */
        !            26:        TTYPE,                  /* <type> */
        !            27:        MAXT                    /* number of different genres */
        !            28: };
        !            29: 
        !            30: 
        !            31:                /* defaults -- can be changed with run time options */
        !            32: enum {
        !            33:        MAXPROD         = 400,  /* maximum number of productions */
        !            34:        MAXTERM         = 200,  /* maximum number of different terminals */
        !            35:        MAXNTERM        = 150,  /* maximum number of non terminal symbols */
        !            36:        MAXSTATE        = 800,  /* max # of states */
        !            37:        MAXPRODL        = 20,   /* maximum number of symbols in any prodn */
        !            38:        MAXITEM         = 160,  /* maximum number of items in any state */
        !            39:        MAXREDS         = 300,  /* maximum number of reductions per state */
        !            40:        MAXTYPE         = 20    /* for the union of YYSTYPE */
        !            41: };
        !            42: 
        !            43: /*
        !            44:  * This defines the size of some char-based bit-sets declared below, and thus
        !            45:  * sets a hard upper bound on the configurable number of terminals. The
        !            46:  * original form of this was:
        !            47:  */
        !            48: #if 0
        !            49:                                /* if maxterm is > 127 change LSETSIZE */
        !            50: #define LSETSIZE 30            /* chars in ws ::= MAXTERM/8 + 1 */
        !            51: #endif
        !            52: 
        !            53: #define        LSETSIZE        (MAXTERM * 2 / CHAR_BIT + 1)
        !            54: 
        !            55:                /* keyword codings */
        !            56: enum {
        !            57:        START           = 1,
        !            58:                /* %token .. %nonassoc must be contiguously coded */
        !            59:        TOKEN,
        !            60:        LEFT,
        !            61:        RIGHT,
        !            62:        NONASSOC,
        !            63:        UNION,
        !            64:        PREC,
        !            65:        TYPE,
        !            66:        SEMICOLON,
        !            67:        VBAR,           /* production separators */
        !            68:        LBRAC,          /* beginning of action */
        !            69:        T_IDENT,
        !            70:        C_IDENT,
        !            71:        MARK,
        !            72:        IDENT,
        !            73:        COMMA,
        !            74:        INTEGER
        !            75: };
        !            76: 
        !            77:        /* precedence associativities */
        !            78: enum {
        !            79:        UNASSOC         = 0,
        !            80:        LASSOC,
        !            81:        RASSOC,
        !            82:        BASSOC          /* "binary" associativity, meaning %nonassoc */
        !            83: };
        !            84: 
        !            85:                /* macros */
        !            86:                /* character manipulation */
        !            87: 
        !            88:                /* run of the mill manifests */
        !            89: #define UINT -1                        /* "unknown" type -- integer */
        !            90: #define UNKNOWN -1
        !            91: #define SYMSIZE 32
        !            92: #define DERIV 01               /* non terminal derives the empty string */
        !            93: #define CPRES 02               /* temp flag for closure */
        !            94: #define nterm gtab[TTERM].g_ordno
        !            95: #define nnonterm gtab[TNTERM].g_ordno
        !            96: #define ntype gtab[TTYPE].g_ordno
        !            97: #define maxterm gtab[TTERM].g_maxord
        !            98: #define maxnterm gtab[TNTERM].g_maxord
        !            99: #define maxtype gtab[TTYPE].g_maxord
        !           100: #define maxsym (maxterm+maxnterm+maxtype)
        !           101: #define NTBASE 010000          /* base number for non terminal allocation */
        !           102: #define EOFNO 0
        !           103: #define ERRNO 1
        !           104: #define bounded(v,l,name) if( v>=l ) yyerror(FATAL, bounderr, name, l)
        !           105: #define MAXSYM 353
        !           106: 
        !           107: 
        !           108: struct sym
        !           109: {
        !           110:        char    s_name[SYMSIZE];
        !           111:        int     s_no;   /* ordinal number of symbol */
        !           112:        char    s_prc, s_ass; /* precedence, associativity */
        !           113:        int     s_type;
        !           114:        char    s_genre; /* "kind" of symbol -- terminal, nonterminal, type */
        !           115:                /* remaining flags are only used for non-terminals */
        !           116: 
        !           117:        char    s_flags;        /* for closure and lookahead computations */
        !           118:        int     s_val;  /* external value, for non terminal only */
        !           119:        int     s_nprods;       /* number of productions having nt as lhs */
        !           120:        struct prod **s_prods;
        !           121:        int     s_nstates;      /* for nt A, # of states with item A->. ai* */
        !           122:        int     *s_states;      /* list */
        !           123: };
        !           124: 
        !           125: struct sitem
        !           126: {
        !           127:        int             i_nitems;       /* number of items in set */
        !           128:        int          ** i_items;
        !           129: };
        !           130: #define        SITEM_EXTRA_SIZE(n)     ((n) * sizeof (int *))
        !           131: #define        SITEM_TOTAL_SIZE(n)     (sizeof (struct sitem) + SITEM_EXTRA_SIZE (n))
        !           132: #define        SITEM_EXTRA_INIT(p)     ((p)->i_items = (int **) ((p) + 1))
        !           133: 
        !           134: struct state
        !           135: {
        !           136:        int             s_tgo;
        !           137:        struct tgo    * s_tgos;
        !           138:        int             s_ntgo;
        !           139:        struct ntgo   * s_ntgos;
        !           140:        int             s_nred;
        !           141:        struct redn   * s_reds;
        !           142: } ;
        !           143: 
        !           144: struct prod
        !           145: {
        !           146:        int             p_prodno;       /* index in prdptr */
        !           147:        char            p_prc, p_ass;   /* precedence, associativity */
        !           148:        int           * p_ord;          /*
        !           149:                                         * Ordinal numbers for production,
        !           150:                                         * starting with LHS and then the
        !           151:                                         * RHS ordinals terminated by a -1
        !           152:                                         * sentinel.
        !           153:                                         * The LHS ordinal is negated.
        !           154:                                         */
        !           155: #if    0
        !           156:        int             p_left;         /* -(ordinal number for lhs) */
        !           157:        int           * p_right;        /*
        !           158:                                         * ordinal numbers for rhs w/ -1
        !           159:                                         * end marker
        !           160:                                         */
        !           161: #endif
        !           162: };
        !           163: #define        p_left          p_ord [0]
        !           164: 
        !           165: /*
        !           166:  * Macro for determining additional space required for "n" items in "p_right"
        !           167:  * vector, above.
        !           168:  */
        !           169: #define        PROD_EXTRA_SIZE(n)      (((n) + 1) * sizeof (int))
        !           170: #define        PROD_TOTAL_SIZE(n)      (sizeof (struct prod) + PROD_EXTRA_SIZE (n))
        !           171: #define        PROD_EXTRA_INIT(p)      ((p)->p_ord = (int *) ((p) + 1))
        !           172: #define        PROD_RIGHT(p)           ((p)->p_ord + 1)
        !           173: 
        !           174: struct tgo
        !           175: {
        !           176:        int     tg_trm;         /* ordinal number of terminal */
        !           177:        int     tg_st;
        !           178: };
        !           179: 
        !           180: struct ntgo
        !           181: {
        !           182:        int     ng_nt;          /* ordinal number of non terminal */
        !           183:        int     ng_st;          /* index of state */
        !           184:        union {                         /* MWC DSC */
        !           185:                struct rel *reln;       /* pointer to relation set */
        !           186:                struct lset *look;      /* pointer to lookahead set */
        !           187:        } cheapo;                       /* they're not used at once, so... */
        !           188: };
        !           189: #define ng_rel cheapo.reln
        !           190: #define ng_lset cheapo.look
        !           191: 
        !           192: struct redn
        !           193: {
        !           194:        struct prod *rd_prod;   /* production pointer */
        !           195:        struct lset *rd_lset;   /* lookahead set */
        !           196: };
        !           197: 
        !           198: /* relation between nt transitions */
        !           199: struct rel
        !           200: {
        !           201:        int             r_count;
        !           202:        int           * r_list;
        !           203: };
        !           204: #define        REL_EXTRA_SIZE(n)       ((n) * sizeof (int))
        !           205: #define        REL_TOTAL_SIZE(n)       (sizeof (struct rel) + REL_EXTRA_SIZE (n))
        !           206: #define        REL_EXTRA_INIT(p)       ((p)->r_list = (int *) ((p) + 1))
        !           207: 
        !           208: struct trans
        !           209: {
        !           210:        struct ntgo   * t_trans;
        !           211:        int             t_level;
        !           212: };
        !           213: 
        !           214: struct lset
        !           215: {
        !           216:        union {
        !           217:                unsigned char u_bits[LSETSIZE];
        !           218:                struct  lset *u_next;
        !           219:        } un;
        !           220: };
        !           221: #define l_bits un.u_bits
        !           222: #define l_next un.u_next
        !           223: 
        !           224: struct resv
        !           225: {
        !           226:        char    *r_name;
        !           227:        int     r_val;
        !           228: };
        !           229: 
        !           230: struct genre
        !           231: {
        !           232:        int     g_ordno;                /* current index for table ptr */
        !           233:        int     g_maxord;               /* limit value for g_ordno */
        !           234:        int     g_base;                 /* "base" value for s_no */
        !           235:        struct sym ***g_sptr;   /* pointer to table for type - MWC DSC */
        !           236:        char    *g_name;
        !           237: };
        !           238: 
        !           239: typedef union
        !           240: {
        !           241:        struct  sym *sptr;
        !           242:        int     ival;
        !           243: } YYSTYPE;
        !           244: 
        !           245: extern struct sym **symtab;    /* global symbol table */
        !           246: extern struct sym **ntrmptr;   /* non terminal pointers into symtab */
        !           247: extern struct sym **trmptr;    /* " terminal " " */
        !           248: extern struct sym **typeptr;   /* " type " " */
        !           249: extern struct state *states;
        !           250: extern struct sitem **items;
        !           251: extern struct prod **prdptr;
        !           252: extern int yyline;
        !           253: extern nerrors;
        !           254: extern FILE *defin, *tabout, *actout, *listout, *optout, *fhdr;
        !           255: extern int tno;
        !           256: extern char *gramy;    /* input file name */
        !           257: extern char *ytabc;    /* y.tab.c output file */
        !           258: extern char *youtput;  /* listing file */
        !           259: extern char *ytabh;    /* header file for token # definers */
        !           260: extern char acttmp[], opttmp[];
        !           261: extern char *parser;
        !           262: extern char    bounderr[];
        !           263: extern struct sitem *nititem;
        !           264: extern struct prod *nitprod;
        !           265: extern verbose, yydebug;
        !           266: extern pstat;
        !           267: extern int nstates;
        !           268: extern int nprod;
        !           269: extern int maxstates;
        !           270: extern int maxprod;
        !           271: extern int nrrconf, nsrconf;
        !           272: extern int ndupgos, ndupacts;
        !           273: extern struct genre gtab[MAXT];
        !           274: extern int startsym;
        !           275: extern int predlev;
        !           276: extern struct resv restab[];
        !           277: extern int maxitem, maxprodl, maxreds;
        !           278: 
        !           279: char   *calloc();
        !           280: char   *yalloc();
        !           281: char   *ptosym();
        !           282: char   *prsym();
        !           283: char   *nextarg();
        !           284: struct ntgo    *findnt();
        !           285: struct lset    *getset();

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.