1/* 2 * @(#)dextern 4.1 (Berkeley) 02/11/83 3 */ 4# include <stdio.h> 5# include <ctype.h> 6# include "files" 7 8 /* MANIFEST CONSTANT DEFINITIONS */ 9 10 /* base of nonterminal internal numbers */ 11# define NTBASE 010000 12 13 /* internal codes for error and accept actions */ 14 15# define ERRCODE 8190 16# define ACCEPTCODE 8191 17 18 /* sizes and limits */ 19 20# ifdef HUGE 21# define ACTSIZE 12000 22# define MEMSIZE 12000 23# define NSTATES 750 24# define NTERMS 127 25# define NPROD 600 26# define NNONTERM 300 27# define TEMPSIZE 1200 28# define CNAMSZ 5000 29# define LSETSIZE 600 30# define WSETSIZE 350 31# endif 32 33# ifdef MEDIUM 34# define ACTSIZE 4000 35# define MEMSIZE 5200 36# define NSTATES 600 37# define NTERMS 127 38# define NPROD 400 39# define NNONTERM 200 40# define TEMPSIZE 800 41# define CNAMSZ 4000 42# define LSETSIZE 450 43# define WSETSIZE 250 44# endif 45 46# define NAMESIZE 50 47# define NTYPES 63 48 49# ifdef WORD32 50# define TBITSET ((32+NTERMS)/32) 51 52 /* bit packing macros (may be machine dependent) */ 53# define BIT(a,i) ((a)[(i)>>5] & (1<<((i)&037))) 54# define SETBIT(a,i) ((a)[(i)>>5] |= (1<<((i)&037))) 55 56 /* number of words needed to hold n+1 bits */ 57# define NWORDS(n) (((n)+32)/32) 58 59# else 60 61# define TBITSET ((16+NTERMS)/16) 62 63 /* bit packing macros (may be machine dependent) */ 64# define BIT(a,i) ((a)[(i)>>4] & (1<<((i)&017))) 65# define SETBIT(a,i) ((a)[(i)>>4] |= (1<<((i)&017))) 66 67 /* number of words needed to hold n+1 bits */ 68# define NWORDS(n) (((n)+16)/16) 69# endif 70 71 /* relationships which must hold: 72 TBITSET ints must hold NTERMS+1 bits... 73 WSETSIZE >= NNONTERM 74 LSETSIZE >= NNONTERM 75 TEMPSIZE >= NTERMS + NNONTERMs + 1 76 TEMPSIZE >= NSTATES 77 */ 78 79 /* associativities */ 80 81# define NOASC 0 /* no assoc. */ 82# define LASC 1 /* left assoc. */ 83# define RASC 2 /* right assoc. */ 84# define BASC 3 /* binary assoc. */ 85 86 /* flags for state generation */ 87 88# define DONE 0 89# define MUSTDO 1 90# define MUSTLOOKAHEAD 2 91 92 /* flags for a rule having an action, and being reduced */ 93 94# define ACTFLAG 04 95# define REDFLAG 010 96 97 /* output parser flags */ 98# define YYFLAG1 (-1000) 99 100 /* macros for getting associativity and precedence levels */ 101 102# define ASSOC(i) ((i)&03) 103# define PLEVEL(i) (((i)>>4)&077) 104# define TYPE(i) ((i>>10)&077) 105 106 /* macros for setting associativity and precedence levels */ 107 108# define SETASC(i,j) i|=j 109# define SETPLEV(i,j) i |= (j<<4) 110# define SETTYPE(i,j) i |= (j<<10) 111 112 /* looping macros */ 113 114# define TLOOP(i) for(i=1;i<=ntokens;++i) 115# define NTLOOP(i) for(i=0;i<=nnonter;++i) 116# define PLOOP(s,i) for(i=s;i<nprod;++i) 117# define SLOOP(i) for(i=0;i<nstate;++i) 118# define WSBUMP(x) ++x 119# define WSLOOP(s,j) for(j=s;j<cwp;++j) 120# define ITMLOOP(i,p,q) q=pstate[i+1];for(p=pstate[i];p<q;++p) 121# define SETLOOP(i) for(i=0;i<tbitset;++i) 122 123 /* I/O descriptors */ 124 125extern FILE * finput; /* input file */ 126extern FILE * faction; /* file for saving actions */ 127extern FILE *fdefine; /* file for # defines */ 128extern FILE * ftable; /* y.tab.c file */ 129extern FILE * ftemp; /* tempfile to pass 2 */ 130extern FILE * foutput; /* y.output file */ 131 132 /* structure declarations */ 133 134struct looksets { 135 int lset[TBITSET]; 136 }; 137 138struct item { 139 int *pitem; 140 struct looksets *look; 141 }; 142 143struct toksymb { 144 char *name; 145 int value; 146 }; 147 148struct ntsymb { 149 char *name; 150 int tvalue; 151 }; 152 153struct wset { 154 int *pitem; 155 int flag; 156 struct looksets ws; 157 }; 158 159 /* token information */ 160 161extern int ntokens ; /* number of tokens */ 162extern struct toksymb tokset[]; 163extern int toklev[]; /* vector with the precedence of the terminals */ 164 165 /* nonterminal information */ 166 167extern int nnonter ; /* the number of nonterminals */ 168extern struct ntsymb nontrst[]; 169 170 /* grammar rule information */ 171 172extern int nprod ; /* number of productions */ 173extern int *prdptr[]; /* pointers to descriptions of productions */ 174extern int levprd[] ; /* contains production levels to break conflicts */ 175 176 /* state information */ 177 178extern int nstate ; /* number of states */ 179extern struct item *pstate[]; /* pointers to the descriptions of the states */ 180extern int tystate[]; /* contains type information about the states */ 181extern int defact[]; /* the default action of the state */ 182extern int tstates[]; /* the states deriving each token */ 183extern int ntstates[]; /* the states deriving each nonterminal */ 184extern int mstates[]; /* the continuation of the chains begun in tstates and ntstates */ 185 186 /* lookahead set information */ 187 188extern struct looksets lkst[]; 189extern int nolook; /* flag to turn off lookahead computations */ 190 191 /* working set information */ 192 193extern struct wset wsets[]; 194extern struct wset *cwp; 195 196 /* storage for productions */ 197 198extern int mem0[]; 199extern int *mem; 200 201 /* storage for action table */ 202 203extern int amem[]; /* action table storage */ 204extern int *memp ; /* next free action table position */ 205extern int indgo[]; /* index to the stored goto table */ 206 207 /* temporary vector, indexable by states, terms, or ntokens */ 208 209extern int temp1[]; 210extern int lineno; /* current line number */ 211 212 /* statistics collection variables */ 213 214extern int zzgoent ; 215extern int zzgobest ; 216extern int zzacent ; 217extern int zzexcp ; 218extern int zzclose ; 219extern int zzrrconf ; 220extern int zzsrconf ; 221 /* define functions with strange types... */ 222 223extern char *cstash(); 224extern struct looksets *flset(); 225extern char *symnam(); 226extern char *writem(); 227 228 /* default settings for a number of macros */ 229 230 /* name of yacc tempfiles */ 231 232# ifndef TEMPNAME 233# define TEMPNAME "yacc.tmp" 234# endif 235 236# ifndef ACTNAME 237# define ACTNAME "yacc.acts" 238# endif 239 240 /* output file name */ 241 242# ifndef OFILE 243# define OFILE "y.tab.c" 244# endif 245 246 /* user output file name */ 247 248# ifndef FILEU 249# define FILEU "y.output" 250# endif 251 252 /* output file for # defines */ 253 254# ifndef FILED 255# define FILED "y.tab.h" 256# endif 257 258 /* command to clobber tempfiles after use */ 259 260# ifndef ZAPFILE 261# define ZAPFILE(x) unlink(x) 262# endif 263