# include <stdio.h> /* MANIFEST CONSTANT DEFINITIONS */ # define NTBASE 010000 /* internal codes for error and accept actions */ # define ERRCODE 8190 # define ACCEPTCODE 8191 # define _actsize 1500 # define _memsize 4000 # define _nstates 475 # define _nterms 95 # define _nprod 250 # define _nnonterm 150 # define _tempsize 475 # define _cnamsz 2000 # define _lsetsize 250 # define _wsetsize 150 # define _namesize 50 # define _tbitset 6 /* relationships which must hold: _tbitset ints must hold _nterms+1 bits... _wsetsize >= _nnonterm _lsetsize >= _nnonterm _tempsize >= _nterms + _nnonterms + 1 _tempsize >= _nstates */ extern int tbitset; /* number of wds of lookahead vector */ extern int nolook; /* flag to turn off lookahed computations */ struct looksets { int lset[ _tbitset ]; } ; struct item { int *pitem; struct looksets *look; } ; /* associativities */ # define NOASC 0 /* no assoc. */ # define LASC 1 /* left assoc. */ # define RASC 2 /* right assoc. */ # define BASC 3 /* binary assoc. */ /* flags for state generation */ # define DONE 0 # define MUSTDO 1 # define MUSTLOOKAHEAD 2 /* flags for a rule having an action, and being reduced */ # define ACTFLAG 04 # define REDFLAG 010 /* output parser flags */ # define YYFLAG1 (-1000) /* macros for getting associativity and precedence levels */ # define ASSOC(i) ((i)&03) # define PLEVEL(i) ((i)>>4) /* macros for setting associativity and precedence levels */ # define SETASC(i,j) i=|j # define SETPLEV(i,j) i =| (j<<4) /* looping macros */ # define TLOOP(i) for(i=1;i<=nterms;++i) # define NTLOOP(i) for(i=0;i<=nnonter;++i) # define PLOOP(s,i) for(i=s;i<nprod;++i) # define SLOOP(i) for(i=0;i<nstate;++i) # define WSBUMP(x) ++x # define WSLOOP(s,j) for(j=s;j<cwp;++j) # define ITMLOOP(i,p,q) q=pstate[i+1];for(p=pstate[i];p<q;++p) # define SETLOOP(i) for(i=0;i<tbitset;++i) extern int nstate ; /* number of states */ extern struct item *pstate[]; /* pointers to the descriptions of the states */ extern int actsiz; /* size of the action table array */ extern int tystate[]; /* contains type information about the states */ /* 0 = simple state, completely generated 1 = state awaiting generation 2 = state with an empty production in closure */ extern int stsize ; /* maximum number of states, at present */ extern int memsiz ; /* maximum size for productions and states */ extern int mem0[] ; /* added production */ extern int *mem ; extern int amem[]; /* action table storage */ extern int actsiz; /* action table size */ extern int *memp ; /* next free action table position */ extern int nprod ; /* number of productions */ extern int *prdptr[]; /* pointers to descriptions of productions */ extern int prdlim; /* the number of productions allowed */ extern int levprd[] ; /* contains production levels to break conflicts */ extern int nterms ; /* number of terminals */ extern int nerrors; /* number of errors */ extern int fatfl; /* if on, error is fatal */ extern int extval; /* start of output values */ extern struct sxxx1 {char *name; int value;} trmset[]; extern char tokname[]; extern char cnames[]; extern int cnamsz; extern char *cnamp; /* temporary vectors, indexable by states, terms, or nterms */ extern int temp1[]; extern int trmlev[]; /* vector with the precedence of the terminals */ /* The levels are the same as for levprd, but bit 04 is always 0 */ /* the ascii representations of the nonterminals */ extern struct sxxx2 { char *name; } nontrst[]; extern int indgo[]; /* index to the stored goto table */ extern int defact[]; extern int ***pres; /* vector of pointers to the productions yielding each nonterminal */ extern struct looksets **pfirst; /* vector of pointers to first sets for each nonterminal */ extern int *pempty ; /* table of nonterminals nontrivially deriving e */ extern int nnonter ; /* the number of nonterminals */ extern int lastred ; /* the number of the last reduction of a state */ extern FILE * finput; /* input file */ extern FILE * faction; /* file for saving actions */ extern FILE *fdefine; /* file for # defines */ extern FILE * ftable; /* y.tab.c file */ extern FILE * ftemp; /* tempfile to pass 2 */ extern FILE * foutput; /* y.output file */ extern FILE *fopen(); extern struct wset *zzcwp; extern int zzgoent ; extern int zzgobest ; extern int zzacent ; extern int zzexcp ; extern int zzclose ; extern int zzrrconf ; extern int zzsrconf ; extern int zzmemsz; extern int ntlim ; /* maximum number of nonterminals */ extern int tlim ; /* maximum number of terminals */ extern int lineno; /* current line number */ extern int tstates[]; extern int ntstates[]; extern int mstates[]; extern struct looksets clset; extern struct looksets lkst[]; extern int nlset; /* next lookahead set index */ extern int lsetsz; /* number of lookahead sets */ extern struct wset { int *pitem, flag, ws[ _tbitset ]; } wsets[]; extern struct wset *cwp; extern int wssize; extern int numbval; /* the value of an input number */ extern char lflag; /* language: 0 = C, 1 = RATFOR, 2 = EFL */ extern int ndefout; /* number of defined symbols output */ # define C 0 # define RATFOR 1 # define EFL 2 /* define a couple of functions with strange types... */ extern char *cstash(); extern struct looksets *flset(); extern char *symnam(); extern char *writem(); extern int *yalloc(); /* a lot of arrays containing code indexed by lflag */ extern char *ofiles[]; extern int oflags[]; extern char *excfb[], *excfsb[], *excfc[], *excfse[], *excfe[]; extern char *parser[]; extern int carray(), rarray(), earray(); extern int (*warray[])(); extern char *ndefs[]; extern char *acts[], *acte[], *dollar[];