Blame


1 3940506b 2005-01-13 devnull #include <u.h>
2 3940506b 2005-01-13 devnull #include <libc.h>
3 3940506b 2005-01-13 devnull #include <bio.h>
4 3940506b 2005-01-13 devnull #include <ctype.h>
5 3940506b 2005-01-13 devnull
6 3940506b 2005-01-13 devnull #define Bungetrune Bungetc /* ok for now. */
7 3940506b 2005-01-13 devnull
8 3940506b 2005-01-13 devnull /*
9 3940506b 2005-01-13 devnull * all these are 32 bit
10 3940506b 2005-01-13 devnull */
11 3940506b 2005-01-13 devnull #define TBITSET ((32+NTERMS)/32) /* BOTCH?? +31 */
12 3940506b 2005-01-13 devnull #define BIT(a,i) ((a)[(i)>>5] & (1<<((i)&037)))
13 3940506b 2005-01-13 devnull #define SETBIT(a,i) ((a)[(i)>>5] |= (1<<((i)&037)))
14 3940506b 2005-01-13 devnull #define NWORDS(n) (((n)+32)/32)
15 3940506b 2005-01-13 devnull
16 459eae0c 2005-01-14 devnull char *PARSER = "#9/lib/yaccpar";
17 459eae0c 2005-01-14 devnull char *PARSERS = "#9/lib/yaccpars";
18 3940506b 2005-01-13 devnull #define TEMPNAME "y.tmp.XXXXXX"
19 3940506b 2005-01-13 devnull #define ACTNAME "y.acts.XXXXXX"
20 3940506b 2005-01-13 devnull #define OFILE "tab.c"
21 3940506b 2005-01-13 devnull #define FILEU "output"
22 3940506b 2005-01-13 devnull #define FILED "tab.h"
23 3940506b 2005-01-13 devnull #define FILEDEBUG "debug"
24 3940506b 2005-01-13 devnull
25 3940506b 2005-01-13 devnull enum
26 3940506b 2005-01-13 devnull {
27 3940506b 2005-01-13 devnull /*
28 3940506b 2005-01-13 devnull * the following are adjustable
29 3940506b 2005-01-13 devnull * according to memory size
30 3940506b 2005-01-13 devnull */
31 3940506b 2005-01-13 devnull ACTSIZE = 40000,
32 3940506b 2005-01-13 devnull MEMSIZE = 40000,
33 3940506b 2005-01-13 devnull NSTATES = 2000,
34 3940506b 2005-01-13 devnull NTERMS = 511,
35 3940506b 2005-01-13 devnull NPROD = 1600,
36 3940506b 2005-01-13 devnull NNONTERM = 600,
37 3940506b 2005-01-13 devnull TEMPSIZE = 2000,
38 3940506b 2005-01-13 devnull CNAMSZ = 10000,
39 3940506b 2005-01-13 devnull LSETSIZE = 2400,
40 3940506b 2005-01-13 devnull WSETSIZE = 350,
41 3940506b 2005-01-13 devnull
42 3940506b 2005-01-13 devnull NAMESIZE = 50,
43 3940506b 2005-01-13 devnull NTYPES = 63,
44 3940506b 2005-01-13 devnull ISIZE = 400,
45 3940506b 2005-01-13 devnull
46 3940506b 2005-01-13 devnull PRIVATE = 0xE000, /* unicode private use */
47 3940506b 2005-01-13 devnull
48 3940506b 2005-01-13 devnull /* relationships which must hold:
49 3940506b 2005-01-13 devnull TBITSET ints must hold NTERMS+1 bits...
50 3940506b 2005-01-13 devnull WSETSIZE >= NNONTERM
51 3940506b 2005-01-13 devnull LSETSIZE >= NNONTERM
52 3940506b 2005-01-13 devnull TEMPSIZE >= NTERMS + NNONTERM + 1
53 3940506b 2005-01-13 devnull TEMPSIZE >= NSTATES
54 3940506b 2005-01-13 devnull */
55 3940506b 2005-01-13 devnull
56 3940506b 2005-01-13 devnull NTBASE = 010000,
57 3940506b 2005-01-13 devnull ERRCODE = 8190,
58 3940506b 2005-01-13 devnull ACCEPTCODE = 8191,
59 3940506b 2005-01-13 devnull
60 3940506b 2005-01-13 devnull NOASC = 0, /* no assoc. */
61 3940506b 2005-01-13 devnull LASC = 1, /* left assoc. */
62 3940506b 2005-01-13 devnull RASC = 2, /* right assoc. */
63 3940506b 2005-01-13 devnull BASC = 3, /* binary assoc. */
64 3940506b 2005-01-13 devnull
65 3940506b 2005-01-13 devnull /* flags for state generation */
66 3940506b 2005-01-13 devnull
67 3940506b 2005-01-13 devnull DONE = 0,
68 3940506b 2005-01-13 devnull MUSTDO = 1,
69 3940506b 2005-01-13 devnull MUSTLOOKAHEAD = 2,
70 3940506b 2005-01-13 devnull
71 3940506b 2005-01-13 devnull /* flags for a rule having an action, and being reduced */
72 3940506b 2005-01-13 devnull
73 3940506b 2005-01-13 devnull ACTFLAG = 04,
74 3940506b 2005-01-13 devnull REDFLAG = 010,
75 3940506b 2005-01-13 devnull
76 3940506b 2005-01-13 devnull /* output parser flags */
77 3940506b 2005-01-13 devnull YYFLAG1 = -1000,
78 3940506b 2005-01-13 devnull
79 3940506b 2005-01-13 devnull /* parse tokens */
80 3940506b 2005-01-13 devnull IDENTIFIER = PRIVATE,
81 3940506b 2005-01-13 devnull MARK,
82 3940506b 2005-01-13 devnull TERM,
83 3940506b 2005-01-13 devnull LEFT,
84 3940506b 2005-01-13 devnull RIGHT,
85 3940506b 2005-01-13 devnull BINARY,
86 3940506b 2005-01-13 devnull PREC,
87 3940506b 2005-01-13 devnull LCURLY,
88 3940506b 2005-01-13 devnull IDENTCOLON,
89 3940506b 2005-01-13 devnull NUMBER,
90 3940506b 2005-01-13 devnull START,
91 3940506b 2005-01-13 devnull TYPEDEF,
92 3940506b 2005-01-13 devnull TYPENAME,
93 3940506b 2005-01-13 devnull UNION,
94 3940506b 2005-01-13 devnull
95 3940506b 2005-01-13 devnull ENDFILE = 0,
96 3940506b 2005-01-13 devnull
97 3940506b 2005-01-13 devnull EMPTY = 1,
98 3940506b 2005-01-13 devnull WHOKNOWS = 0,
99 3940506b 2005-01-13 devnull OK = 1,
100 3940506b 2005-01-13 devnull NOMORE = -1000,
101 3940506b 2005-01-13 devnull };
102 3940506b 2005-01-13 devnull
103 3940506b 2005-01-13 devnull /* macros for getting associativity and precedence levels */
104 3940506b 2005-01-13 devnull
105 3940506b 2005-01-13 devnull #define ASSOC(i) ((i)&03)
106 3940506b 2005-01-13 devnull #define PLEVEL(i) (((i)>>4)&077)
107 3940506b 2005-01-13 devnull #define TYPE(i) (((i)>>10)&077)
108 3940506b 2005-01-13 devnull
109 3940506b 2005-01-13 devnull /* macros for setting associativity and precedence levels */
110 3940506b 2005-01-13 devnull
111 3940506b 2005-01-13 devnull #define SETASC(i,j) i |= j
112 3940506b 2005-01-13 devnull #define SETPLEV(i,j) i |= (j<<4)
113 3940506b 2005-01-13 devnull #define SETTYPE(i,j) i |= (j<<10)
114 3940506b 2005-01-13 devnull
115 3940506b 2005-01-13 devnull /* looping macros */
116 3940506b 2005-01-13 devnull
117 3940506b 2005-01-13 devnull #define TLOOP(i) for(i=1; i<=ntokens; i++)
118 3940506b 2005-01-13 devnull #define NTLOOP(i) for(i=0; i<=nnonter; i++)
119 3940506b 2005-01-13 devnull #define PLOOP(s,i) for(i=s; i<nprod; i++)
120 3940506b 2005-01-13 devnull #define SLOOP(i) for(i=0; i<nstate; i++)
121 3940506b 2005-01-13 devnull #define WSBUMP(x) x++
122 3940506b 2005-01-13 devnull #define WSLOOP(s,j) for(j=s; j<cwp; j++)
123 3940506b 2005-01-13 devnull #define ITMLOOP(i,p,q) for(q=pstate[i+1], p=pstate[i]; p<q; p++)
124 3940506b 2005-01-13 devnull #define SETLOOP(i) for(i=0; i<tbitset; i++)
125 3940506b 2005-01-13 devnull
126 3940506b 2005-01-13 devnull /* command to clobber tempfiles after use */
127 3940506b 2005-01-13 devnull
128 3940506b 2005-01-13 devnull #define ZAPFILE(x) if(x) remove(x)
129 3940506b 2005-01-13 devnull
130 3940506b 2005-01-13 devnull /* I/O descriptors */
131 3940506b 2005-01-13 devnull
132 3940506b 2005-01-13 devnull Biobuf* faction; /* file for saving actions */
133 3940506b 2005-01-13 devnull Biobuf* fdefine; /* file for #defines */
134 3940506b 2005-01-13 devnull Biobuf* fdebug; /* y.debug for strings for debugging */
135 3940506b 2005-01-13 devnull Biobuf* ftable; /* y.tab.c file */
136 3940506b 2005-01-13 devnull Biobuf* ftemp; /* tempfile to pass 2 */
137 3940506b 2005-01-13 devnull Biobuf* finput; /* input file */
138 3940506b 2005-01-13 devnull Biobuf* foutput; /* y.output file */
139 3940506b 2005-01-13 devnull
140 3940506b 2005-01-13 devnull /* communication variables between various I/O routines */
141 3940506b 2005-01-13 devnull
142 3940506b 2005-01-13 devnull char* infile; /* input file name */
143 3940506b 2005-01-13 devnull int numbval; /* value of an input number */
144 3940506b 2005-01-13 devnull char tokname[NAMESIZE+4]; /* input token name, slop for runes and 0 */
145 3940506b 2005-01-13 devnull
146 3940506b 2005-01-13 devnull /* structure declarations */
147 3940506b 2005-01-13 devnull
148 3940506b 2005-01-13 devnull typedef
149 3940506b 2005-01-13 devnull struct
150 3940506b 2005-01-13 devnull {
151 3940506b 2005-01-13 devnull int lset[TBITSET];
152 3940506b 2005-01-13 devnull } Lkset;
153 3940506b 2005-01-13 devnull
154 3940506b 2005-01-13 devnull typedef
155 3940506b 2005-01-13 devnull struct
156 3940506b 2005-01-13 devnull {
157 3940506b 2005-01-13 devnull int* pitem;
158 3940506b 2005-01-13 devnull Lkset* look;
159 3940506b 2005-01-13 devnull } Item;
160 3940506b 2005-01-13 devnull
161 3940506b 2005-01-13 devnull typedef
162 3940506b 2005-01-13 devnull struct
163 3940506b 2005-01-13 devnull {
164 3940506b 2005-01-13 devnull char* name;
165 3940506b 2005-01-13 devnull int value;
166 3940506b 2005-01-13 devnull } Symb;
167 3940506b 2005-01-13 devnull
168 3940506b 2005-01-13 devnull typedef
169 3940506b 2005-01-13 devnull struct
170 3940506b 2005-01-13 devnull {
171 3940506b 2005-01-13 devnull int* pitem;
172 3940506b 2005-01-13 devnull int flag;
173 3940506b 2005-01-13 devnull Lkset ws;
174 3940506b 2005-01-13 devnull } Wset;
175 3940506b 2005-01-13 devnull
176 3940506b 2005-01-13 devnull /* storage of names */
177 3940506b 2005-01-13 devnull
178 3940506b 2005-01-13 devnull char cnames[CNAMSZ]; /* place where token and nonterminal names are stored */
179 3940506b 2005-01-13 devnull int cnamsz = CNAMSZ; /* size of cnames */
180 3940506b 2005-01-13 devnull char* cnamp = cnames; /* place where next name is to be put in */
181 3940506b 2005-01-13 devnull int ndefout = 4; /* number of defined symbols output */
182 3940506b 2005-01-13 devnull char* tempname;
183 3940506b 2005-01-13 devnull char* actname;
184 3940506b 2005-01-13 devnull char ttempname[] = TEMPNAME;
185 3940506b 2005-01-13 devnull char tactname[] = ACTNAME;
186 459eae0c 2005-01-14 devnull char* parser;
187 3940506b 2005-01-13 devnull char* yydebug;
188 3940506b 2005-01-13 devnull
189 3940506b 2005-01-13 devnull /* storage of types */
190 3940506b 2005-01-13 devnull int ntypes; /* number of types defined */
191 3940506b 2005-01-13 devnull char* typeset[NTYPES]; /* pointers to type tags */
192 3940506b 2005-01-13 devnull
193 3940506b 2005-01-13 devnull /* token information */
194 3940506b 2005-01-13 devnull
195 3940506b 2005-01-13 devnull int ntokens = 0 ; /* number of tokens */
196 3940506b 2005-01-13 devnull Symb tokset[NTERMS];
197 3940506b 2005-01-13 devnull int toklev[NTERMS]; /* vector with the precedence of the terminals */
198 3940506b 2005-01-13 devnull
199 3940506b 2005-01-13 devnull /* nonterminal information */
200 3940506b 2005-01-13 devnull
201 3940506b 2005-01-13 devnull int nnonter = -1; /* the number of nonterminals */
202 3940506b 2005-01-13 devnull Symb nontrst[NNONTERM];
203 3940506b 2005-01-13 devnull int start; /* start symbol */
204 3940506b 2005-01-13 devnull
205 3940506b 2005-01-13 devnull /* assigned token type values */
206 3940506b 2005-01-13 devnull int extval = 0;
207 3940506b 2005-01-13 devnull
208 3940506b 2005-01-13 devnull char* ytabc = OFILE; /* name of y.tab.c */
209 3940506b 2005-01-13 devnull
210 3940506b 2005-01-13 devnull /* grammar rule information */
211 3940506b 2005-01-13 devnull
212 3940506b 2005-01-13 devnull int mem0[MEMSIZE] ; /* production storage */
213 3940506b 2005-01-13 devnull int* mem = mem0;
214 3940506b 2005-01-13 devnull int nprod = 1; /* number of productions */
215 3940506b 2005-01-13 devnull int* prdptr[NPROD]; /* pointers to descriptions of productions */
216 3940506b 2005-01-13 devnull int levprd[NPROD]; /* precedence levels for the productions */
217 3940506b 2005-01-13 devnull int rlines[NPROD]; /* line number for this rule */
218 3940506b 2005-01-13 devnull
219 3940506b 2005-01-13 devnull /* state information */
220 3940506b 2005-01-13 devnull
221 3940506b 2005-01-13 devnull int nstate = 0; /* number of states */
222 3940506b 2005-01-13 devnull Item* pstate[NSTATES+2]; /* pointers to the descriptions of the states */
223 3940506b 2005-01-13 devnull int tystate[NSTATES]; /* contains type information about the states */
224 3940506b 2005-01-13 devnull int defact[NSTATES]; /* the default actions of states */
225 3940506b 2005-01-13 devnull int tstates[NTERMS]; /* states generated by terminal gotos */
226 3940506b 2005-01-13 devnull int ntstates[NNONTERM]; /* states generated by nonterminal gotos */
227 3940506b 2005-01-13 devnull int mstates[NSTATES]; /* chain of overflows of term/nonterm generation lists */
228 3940506b 2005-01-13 devnull int lastred; /* the number of the last reduction of a state */
229 3940506b 2005-01-13 devnull
230 3940506b 2005-01-13 devnull /* lookahead set information */
231 3940506b 2005-01-13 devnull
232 3940506b 2005-01-13 devnull Lkset lkst[LSETSIZE];
233 3940506b 2005-01-13 devnull int nolook; /* flag to turn off lookahead computations */
234 3940506b 2005-01-13 devnull int tbitset; /* size of lookahead sets */
235 3940506b 2005-01-13 devnull int nlset = 0; /* next lookahead set index */
236 3940506b 2005-01-13 devnull int nolook = 0; /* flag to suppress lookahead computations */
237 3940506b 2005-01-13 devnull Lkset clset; /* temporary storage for lookahead computations */
238 3940506b 2005-01-13 devnull
239 3940506b 2005-01-13 devnull /* working set information */
240 3940506b 2005-01-13 devnull
241 3940506b 2005-01-13 devnull Wset wsets[WSETSIZE];
242 3940506b 2005-01-13 devnull Wset* cwp;
243 3940506b 2005-01-13 devnull
244 3940506b 2005-01-13 devnull /* storage for action table */
245 3940506b 2005-01-13 devnull
246 3940506b 2005-01-13 devnull int amem[ACTSIZE]; /* action table storage */
247 3940506b 2005-01-13 devnull int* memp = amem; /* next free action table position */
248 3940506b 2005-01-13 devnull int indgo[NSTATES]; /* index to the stored goto table */
249 3940506b 2005-01-13 devnull
250 3940506b 2005-01-13 devnull /* temporary vector, indexable by states, terms, or ntokens */
251 3940506b 2005-01-13 devnull
252 3940506b 2005-01-13 devnull int temp1[TEMPSIZE]; /* temporary storage, indexed by terms + ntokens or states */
253 3940506b 2005-01-13 devnull int lineno = 1; /* current input line number */
254 3940506b 2005-01-13 devnull int fatfl = 1; /* if on, error is fatal */
255 3940506b 2005-01-13 devnull int nerrors = 0; /* number of errors */
256 3940506b 2005-01-13 devnull
257 3940506b 2005-01-13 devnull /* statistics collection variables */
258 3940506b 2005-01-13 devnull
259 3940506b 2005-01-13 devnull int zzgoent;
260 3940506b 2005-01-13 devnull int zzgobest;
261 3940506b 2005-01-13 devnull int zzacent;
262 3940506b 2005-01-13 devnull int zzexcp;
263 3940506b 2005-01-13 devnull int zzclose;
264 3940506b 2005-01-13 devnull int zzrrconf;
265 3940506b 2005-01-13 devnull int zzsrconf;
266 3940506b 2005-01-13 devnull
267 3940506b 2005-01-13 devnull int* ggreed = lkst[0].lset;
268 3940506b 2005-01-13 devnull int* pgo = wsets[0].ws.lset;
269 3940506b 2005-01-13 devnull int* yypgo = &nontrst[0].value;
270 3940506b 2005-01-13 devnull
271 3940506b 2005-01-13 devnull int maxspr = 0; /* maximum spread of any entry */
272 3940506b 2005-01-13 devnull int maxoff = 0; /* maximum offset into a array */
273 3940506b 2005-01-13 devnull int* pmem = mem0;
274 3940506b 2005-01-13 devnull int* maxa;
275 3940506b 2005-01-13 devnull int nxdb = 0;
276 3940506b 2005-01-13 devnull int adb = 0;
277 3940506b 2005-01-13 devnull
278 3940506b 2005-01-13 devnull
279 3940506b 2005-01-13 devnull /* storage for information about the nonterminals */
280 3940506b 2005-01-13 devnull
281 3940506b 2005-01-13 devnull int** pres[NNONTERM+2]; /* vector of pointers to productions yielding each nonterminal */
282 3940506b 2005-01-13 devnull Lkset* pfirst[NNONTERM+2]; /* vector of pointers to first sets for each nonterminal */
283 3940506b 2005-01-13 devnull int pempty[NNONTERM+1]; /* vector of nonterminals nontrivially deriving e */
284 3940506b 2005-01-13 devnull
285 3940506b 2005-01-13 devnull /* random stuff picked out from between functions */
286 3940506b 2005-01-13 devnull
287 3940506b 2005-01-13 devnull int indebug = 0;
288 3940506b 2005-01-13 devnull Wset* zzcwp = wsets;
289 3940506b 2005-01-13 devnull int zzgoent = 0;
290 3940506b 2005-01-13 devnull int zzgobest = 0;
291 3940506b 2005-01-13 devnull int zzacent = 0;
292 3940506b 2005-01-13 devnull int zzexcp = 0;
293 3940506b 2005-01-13 devnull int zzclose = 0;
294 3940506b 2005-01-13 devnull int zzsrconf = 0;
295 3940506b 2005-01-13 devnull int* zzmemsz = mem0;
296 3940506b 2005-01-13 devnull int zzrrconf = 0;
297 3940506b 2005-01-13 devnull int pidebug = 0; /* debugging flag for putitem */
298 3940506b 2005-01-13 devnull int gsdebug = 0;
299 3940506b 2005-01-13 devnull int cldebug = 0; /* debugging flag for closure */
300 3940506b 2005-01-13 devnull int pkdebug = 0;
301 3940506b 2005-01-13 devnull int g2debug = 0;
302 3940506b 2005-01-13 devnull
303 3940506b 2005-01-13 devnull struct
304 3940506b 2005-01-13 devnull {
305 3940506b 2005-01-13 devnull char* name;
306 3940506b 2005-01-13 devnull long value;
307 3940506b 2005-01-13 devnull } resrv[] =
308 3940506b 2005-01-13 devnull {
309 3940506b 2005-01-13 devnull "binary", BINARY,
310 3940506b 2005-01-13 devnull "left", LEFT,
311 3940506b 2005-01-13 devnull "nonassoc", BINARY,
312 3940506b 2005-01-13 devnull "prec", PREC,
313 3940506b 2005-01-13 devnull "right", RIGHT,
314 3940506b 2005-01-13 devnull "start", START,
315 3940506b 2005-01-13 devnull "term", TERM,
316 3940506b 2005-01-13 devnull "token", TERM,
317 3940506b 2005-01-13 devnull "type", TYPEDEF,
318 3940506b 2005-01-13 devnull "union", UNION,
319 3940506b 2005-01-13 devnull 0,
320 3940506b 2005-01-13 devnull };
321 3940506b 2005-01-13 devnull
322 3940506b 2005-01-13 devnull /* define functions */
323 3940506b 2005-01-13 devnull
324 3940506b 2005-01-13 devnull void main(int, char**);
325 3940506b 2005-01-13 devnull void others(void);
326 3940506b 2005-01-13 devnull char* chcopy(char*, char*);
327 3940506b 2005-01-13 devnull char* writem(int*);
328 3940506b 2005-01-13 devnull char* symnam(int);
329 3940506b 2005-01-13 devnull void summary(void);
330 3940506b 2005-01-13 devnull void error(char*, ...);
331 3940506b 2005-01-13 devnull void aryfil(int*, int, int);
332 3940506b 2005-01-13 devnull int setunion(int*, int*);
333 3940506b 2005-01-13 devnull void prlook(Lkset*);
334 3940506b 2005-01-13 devnull void cpres(void);
335 3940506b 2005-01-13 devnull void cpfir(void);
336 3940506b 2005-01-13 devnull int state(int);
337 3940506b 2005-01-13 devnull void putitem(int*, Lkset*);
338 3940506b 2005-01-13 devnull void cempty(void);
339 3940506b 2005-01-13 devnull void stagen(void);
340 3940506b 2005-01-13 devnull void closure(int);
341 3940506b 2005-01-13 devnull Lkset* flset(Lkset*);
342 3940506b 2005-01-13 devnull void cleantmp(void);
343 3940506b 2005-01-13 devnull void intr(void);
344 3940506b 2005-01-13 devnull void setup(int, char**);
345 3940506b 2005-01-13 devnull void finact(void);
346 3940506b 2005-01-13 devnull int defin(int, char*);
347 3940506b 2005-01-13 devnull void defout(int);
348 3940506b 2005-01-13 devnull char* cstash(char*);
349 3940506b 2005-01-13 devnull long gettok(void);
350 3940506b 2005-01-13 devnull int fdtype(int);
351 3940506b 2005-01-13 devnull int chfind(int, char*);
352 3940506b 2005-01-13 devnull void cpyunion(void);
353 3940506b 2005-01-13 devnull void cpycode(void);
354 3940506b 2005-01-13 devnull int skipcom(void);
355 3940506b 2005-01-13 devnull void cpyact(int);
356 3940506b 2005-01-13 devnull void openup(char*, int, int, int, char*);
357 3940506b 2005-01-13 devnull void output(void);
358 3940506b 2005-01-13 devnull int apack(int*, int);
359 3940506b 2005-01-13 devnull void go2out(void);
360 3940506b 2005-01-13 devnull void go2gen(int);
361 3940506b 2005-01-13 devnull void precftn(int, int, int);
362 3940506b 2005-01-13 devnull void wract(int);
363 3940506b 2005-01-13 devnull void wrstate(int);
364 3940506b 2005-01-13 devnull void warray(char*, int*, int);
365 3940506b 2005-01-13 devnull void hideprod(void);
366 3940506b 2005-01-13 devnull void callopt(void);
367 3940506b 2005-01-13 devnull void gin(int);
368 3940506b 2005-01-13 devnull void stin(int);
369 3940506b 2005-01-13 devnull int nxti(void);
370 3940506b 2005-01-13 devnull void osummary(void);
371 3940506b 2005-01-13 devnull void aoutput(void);
372 3940506b 2005-01-13 devnull void arout(char*, int*, int);
373 3940506b 2005-01-13 devnull int gtnm(void);
374 3940506b 2005-01-13 devnull
375 3940506b 2005-01-13 devnull void
376 3940506b 2005-01-13 devnull main(int argc, char *argv[])
377 3940506b 2005-01-13 devnull {
378 459eae0c 2005-01-14 devnull PARSER = unsharp(PARSER);
379 459eae0c 2005-01-14 devnull PARSERS = unsharp(PARSERS);
380 459eae0c 2005-01-14 devnull parser = PARSER;
381 3940506b 2005-01-13 devnull
382 3940506b 2005-01-13 devnull setup(argc, argv); /* initialize and read productions */
383 3940506b 2005-01-13 devnull tbitset = NWORDS(ntokens);
384 3940506b 2005-01-13 devnull cpres(); /* make table of which productions yield a given nonterminal */
385 3940506b 2005-01-13 devnull cempty(); /* make a table of which nonterminals can match the empty string */
386 3940506b 2005-01-13 devnull cpfir(); /* make a table of firsts of nonterminals */
387 3940506b 2005-01-13 devnull stagen(); /* generate the states */
388 3940506b 2005-01-13 devnull output(); /* write the states and the tables */
389 3940506b 2005-01-13 devnull go2out();
390 3940506b 2005-01-13 devnull hideprod();
391 3940506b 2005-01-13 devnull summary();
392 3940506b 2005-01-13 devnull callopt();
393 3940506b 2005-01-13 devnull others();
394 3940506b 2005-01-13 devnull exits(0);
395 3940506b 2005-01-13 devnull }
396 3940506b 2005-01-13 devnull
397 3940506b 2005-01-13 devnull /*
398 3940506b 2005-01-13 devnull * put out other arrays, copy the parsers
399 3940506b 2005-01-13 devnull */
400 3940506b 2005-01-13 devnull void
401 3940506b 2005-01-13 devnull others(void)
402 3940506b 2005-01-13 devnull {
403 3940506b 2005-01-13 devnull int c, i, j;
404 3940506b 2005-01-13 devnull
405 459eae0c 2005-01-14 devnull finput = Bopen(parser, OREAD);
406 3940506b 2005-01-13 devnull if(finput == 0)
407 3940506b 2005-01-13 devnull error("cannot open parser %s: %r", parser);
408 3940506b 2005-01-13 devnull warray("yyr1", levprd, nprod);
409 3940506b 2005-01-13 devnull aryfil(temp1, nprod, 0);
410 3940506b 2005-01-13 devnull PLOOP(1, i)
411 3940506b 2005-01-13 devnull temp1[i] = prdptr[i+1]-prdptr[i]-2;
412 3940506b 2005-01-13 devnull warray("yyr2", temp1, nprod);
413 3940506b 2005-01-13 devnull
414 3940506b 2005-01-13 devnull aryfil(temp1, nstate, -1000);
415 3940506b 2005-01-13 devnull TLOOP(i)
416 3940506b 2005-01-13 devnull for(j=tstates[i]; j!=0; j=mstates[j])
417 3940506b 2005-01-13 devnull temp1[j] = i;
418 3940506b 2005-01-13 devnull NTLOOP(i)
419 3940506b 2005-01-13 devnull for(j=ntstates[i]; j!=0; j=mstates[j])
420 3940506b 2005-01-13 devnull temp1[j] = -i;
421 3940506b 2005-01-13 devnull warray("yychk", temp1, nstate);
422 3940506b 2005-01-13 devnull warray("yydef", defact, nstate);
423 3940506b 2005-01-13 devnull
424 3940506b 2005-01-13 devnull /* put out token translation tables */
425 3940506b 2005-01-13 devnull /* table 1 has 0-256 */
426 3940506b 2005-01-13 devnull aryfil(temp1, 256, 0);
427 3940506b 2005-01-13 devnull c = 0;
428 3940506b 2005-01-13 devnull TLOOP(i) {
429 3940506b 2005-01-13 devnull j = tokset[i].value;
430 3940506b 2005-01-13 devnull if(j >= 0 && j < 256) {
431 3940506b 2005-01-13 devnull if(temp1[j]) {
432 3940506b 2005-01-13 devnull print("yacc bug -- cant have 2 different Ts with same value\n");
433 3940506b 2005-01-13 devnull print(" %s and %s\n", tokset[i].name, tokset[temp1[j]].name);
434 3940506b 2005-01-13 devnull nerrors++;
435 3940506b 2005-01-13 devnull }
436 3940506b 2005-01-13 devnull temp1[j] = i;
437 3940506b 2005-01-13 devnull if(j > c)
438 3940506b 2005-01-13 devnull c = j;
439 3940506b 2005-01-13 devnull }
440 3940506b 2005-01-13 devnull }
441 3940506b 2005-01-13 devnull warray("yytok1", temp1, c+1);
442 3940506b 2005-01-13 devnull
443 3940506b 2005-01-13 devnull /* table 2 has PRIVATE-PRIVATE+256 */
444 3940506b 2005-01-13 devnull aryfil(temp1, 256, 0);
445 3940506b 2005-01-13 devnull c = 0;
446 3940506b 2005-01-13 devnull TLOOP(i) {
447 3940506b 2005-01-13 devnull j = tokset[i].value - PRIVATE;
448 3940506b 2005-01-13 devnull if(j >= 0 && j < 256) {
449 3940506b 2005-01-13 devnull if(temp1[j]) {
450 3940506b 2005-01-13 devnull print("yacc bug -- cant have 2 different Ts with same value\n");
451 3940506b 2005-01-13 devnull print(" %s and %s\n", tokset[i].name, tokset[temp1[j]].name);
452 3940506b 2005-01-13 devnull nerrors++;
453 3940506b 2005-01-13 devnull }
454 3940506b 2005-01-13 devnull temp1[j] = i;
455 3940506b 2005-01-13 devnull if(j > c)
456 3940506b 2005-01-13 devnull c = j;
457 3940506b 2005-01-13 devnull }
458 3940506b 2005-01-13 devnull }
459 3940506b 2005-01-13 devnull warray("yytok2", temp1, c+1);
460 3940506b 2005-01-13 devnull
461 3940506b 2005-01-13 devnull /* table 3 has everything else */
462 3940506b 2005-01-13 devnull Bprint(ftable, "long yytok3[] =\n{\n");
463 3940506b 2005-01-13 devnull c = 0;
464 3940506b 2005-01-13 devnull TLOOP(i) {
465 3940506b 2005-01-13 devnull j = tokset[i].value;
466 3940506b 2005-01-13 devnull if(j >= 0 && j < 256)
467 3940506b 2005-01-13 devnull continue;
468 3940506b 2005-01-13 devnull if(j >= PRIVATE && j < 256+PRIVATE)
469 3940506b 2005-01-13 devnull continue;
470 3940506b 2005-01-13 devnull
471 3940506b 2005-01-13 devnull Bprint(ftable, "%4d,%4d,", j, i);
472 3940506b 2005-01-13 devnull c++;
473 3940506b 2005-01-13 devnull if(c%5 == 0)
474 3940506b 2005-01-13 devnull Bprint(ftable, "\n");
475 3940506b 2005-01-13 devnull }
476 3940506b 2005-01-13 devnull Bprint(ftable, "%4d\n};\n", 0);
477 3940506b 2005-01-13 devnull
478 3940506b 2005-01-13 devnull /* copy parser text */
479 3940506b 2005-01-13 devnull while((c=Bgetrune(finput)) != Beof) {
480 3940506b 2005-01-13 devnull if(c == '$') {
481 3940506b 2005-01-13 devnull if((c = Bgetrune(finput)) != 'A')
482 3940506b 2005-01-13 devnull Bputrune(ftable, '$');
483 3940506b 2005-01-13 devnull else { /* copy actions */
484 3940506b 2005-01-13 devnull faction = Bopen(actname, OREAD);
485 3940506b 2005-01-13 devnull if(faction == 0)
486 3940506b 2005-01-13 devnull error("cannot reopen action tempfile");
487 3940506b 2005-01-13 devnull while((c=Bgetrune(faction)) != Beof)
488 3940506b 2005-01-13 devnull Bputrune(ftable, c);
489 3940506b 2005-01-13 devnull Bterm(faction);
490 3940506b 2005-01-13 devnull ZAPFILE(actname);
491 3940506b 2005-01-13 devnull c = Bgetrune(finput);
492 3940506b 2005-01-13 devnull }
493 3940506b 2005-01-13 devnull }
494 3940506b 2005-01-13 devnull Bputrune(ftable, c);
495 3940506b 2005-01-13 devnull }
496 3940506b 2005-01-13 devnull Bterm(ftable);
497 3940506b 2005-01-13 devnull }
498 3940506b 2005-01-13 devnull
499 3940506b 2005-01-13 devnull /*
500 3940506b 2005-01-13 devnull * copies string q into p, returning next free char ptr
501 3940506b 2005-01-13 devnull */
502 3940506b 2005-01-13 devnull char*
503 3940506b 2005-01-13 devnull chcopy(char* p, char* q)
504 3940506b 2005-01-13 devnull {
505 3940506b 2005-01-13 devnull int c;
506 3940506b 2005-01-13 devnull
507 3940506b 2005-01-13 devnull while(c = *q) {
508 3940506b 2005-01-13 devnull if(c == '"')
509 3940506b 2005-01-13 devnull *p++ = '\\';
510 3940506b 2005-01-13 devnull *p++ = c;
511 3940506b 2005-01-13 devnull q++;
512 3940506b 2005-01-13 devnull }
513 3940506b 2005-01-13 devnull *p = 0;
514 3940506b 2005-01-13 devnull return p;
515 3940506b 2005-01-13 devnull }
516 3940506b 2005-01-13 devnull
517 3940506b 2005-01-13 devnull /*
518 3940506b 2005-01-13 devnull * creates output string for item pointed to by pp
519 3940506b 2005-01-13 devnull */
520 3940506b 2005-01-13 devnull char*
521 3940506b 2005-01-13 devnull writem(int *pp)
522 3940506b 2005-01-13 devnull {
523 3940506b 2005-01-13 devnull int i,*p;
524 3940506b 2005-01-13 devnull static char sarr[ISIZE];
525 3940506b 2005-01-13 devnull char* q;
526 3940506b 2005-01-13 devnull
527 3940506b 2005-01-13 devnull for(p=pp; *p>0; p++)
528 3940506b 2005-01-13 devnull ;
529 3940506b 2005-01-13 devnull p = prdptr[-*p];
530 3940506b 2005-01-13 devnull q = chcopy(sarr, nontrst[*p-NTBASE].name);
531 3940506b 2005-01-13 devnull q = chcopy(q, ": ");
532 3940506b 2005-01-13 devnull for(;;) {
533 3940506b 2005-01-13 devnull *q = ' ';
534 3940506b 2005-01-13 devnull p++;
535 3940506b 2005-01-13 devnull if(p == pp)
536 3940506b 2005-01-13 devnull *q = '.';
537 3940506b 2005-01-13 devnull q++;
538 3940506b 2005-01-13 devnull *q = '\0';
539 3940506b 2005-01-13 devnull i = *p;
540 3940506b 2005-01-13 devnull if(i <= 0)
541 3940506b 2005-01-13 devnull break;
542 3940506b 2005-01-13 devnull q = chcopy(q, symnam(i));
543 3940506b 2005-01-13 devnull if(q > &sarr[ISIZE-30])
544 3940506b 2005-01-13 devnull error("item too big");
545 3940506b 2005-01-13 devnull }
546 3940506b 2005-01-13 devnull
547 3940506b 2005-01-13 devnull /* an item calling for a reduction */
548 3940506b 2005-01-13 devnull i = *pp;
549 3940506b 2005-01-13 devnull if(i < 0 ) {
550 3940506b 2005-01-13 devnull q = chcopy(q, " (");
551 3940506b 2005-01-13 devnull sprint(q, "%d)", -i);
552 3940506b 2005-01-13 devnull }
553 3940506b 2005-01-13 devnull return sarr;
554 3940506b 2005-01-13 devnull }
555 3940506b 2005-01-13 devnull
556 3940506b 2005-01-13 devnull /*
557 3940506b 2005-01-13 devnull * return a pointer to the name of symbol i
558 3940506b 2005-01-13 devnull */
559 3940506b 2005-01-13 devnull char*
560 3940506b 2005-01-13 devnull symnam(int i)
561 3940506b 2005-01-13 devnull {
562 3940506b 2005-01-13 devnull char* cp;
563 3940506b 2005-01-13 devnull
564 3940506b 2005-01-13 devnull cp = (i >= NTBASE)? nontrst[i-NTBASE].name: tokset[i].name;
565 3940506b 2005-01-13 devnull if(*cp == ' ')
566 3940506b 2005-01-13 devnull cp++;
567 3940506b 2005-01-13 devnull return cp;
568 3940506b 2005-01-13 devnull }
569 3940506b 2005-01-13 devnull
570 3940506b 2005-01-13 devnull /*
571 3940506b 2005-01-13 devnull * output the summary on y.output
572 3940506b 2005-01-13 devnull */
573 3940506b 2005-01-13 devnull void
574 3940506b 2005-01-13 devnull summary(void)
575 3940506b 2005-01-13 devnull {
576 3940506b 2005-01-13 devnull
577 3940506b 2005-01-13 devnull if(foutput != 0) {
578 3940506b 2005-01-13 devnull Bprint(foutput, "\n%d/%d terminals, %d/%d nonterminals\n",
579 3940506b 2005-01-13 devnull ntokens, NTERMS, nnonter, NNONTERM);
580 3940506b 2005-01-13 devnull Bprint(foutput, "%d/%d grammar rules, %d/%d states\n",
581 3940506b 2005-01-13 devnull nprod, NPROD, nstate, NSTATES);
582 3940506b 2005-01-13 devnull Bprint(foutput, "%d shift/reduce, %d reduce/reduce conflicts reported\n",
583 3940506b 2005-01-13 devnull zzsrconf, zzrrconf);
584 3940506b 2005-01-13 devnull Bprint(foutput, "%d/%d working sets used\n",
585 3940506b 2005-01-13 devnull (int)(zzcwp-wsets), WSETSIZE);
586 3940506b 2005-01-13 devnull Bprint(foutput, "memory: states,etc. %d/%d, parser %d/%d\n",
587 3940506b 2005-01-13 devnull (int)(zzmemsz-mem0), MEMSIZE, (int)(memp-amem), ACTSIZE);
588 3940506b 2005-01-13 devnull Bprint(foutput, "%d/%d distinct lookahead sets\n", nlset, LSETSIZE);
589 3940506b 2005-01-13 devnull Bprint(foutput, "%d extra closures\n", zzclose - 2*nstate);
590 3940506b 2005-01-13 devnull Bprint(foutput, "%d shift entries, %d exceptions\n", zzacent, zzexcp);
591 3940506b 2005-01-13 devnull Bprint(foutput, "%d goto entries\n", zzgoent);
592 3940506b 2005-01-13 devnull Bprint(foutput, "%d entries saved by goto default\n", zzgobest);
593 3940506b 2005-01-13 devnull }
594 3940506b 2005-01-13 devnull if(zzsrconf != 0 || zzrrconf != 0) {
595 3940506b 2005-01-13 devnull print("\nconflicts: ");
596 3940506b 2005-01-13 devnull if(zzsrconf)
597 3940506b 2005-01-13 devnull print("%d shift/reduce", zzsrconf);
598 3940506b 2005-01-13 devnull if(zzsrconf && zzrrconf)
599 3940506b 2005-01-13 devnull print(", ");
600 3940506b 2005-01-13 devnull if(zzrrconf)
601 3940506b 2005-01-13 devnull print("%d reduce/reduce", zzrrconf);
602 3940506b 2005-01-13 devnull print("\n");
603 3940506b 2005-01-13 devnull }
604 3940506b 2005-01-13 devnull if(ftemp != 0) {
605 3940506b 2005-01-13 devnull Bterm(ftemp);
606 3940506b 2005-01-13 devnull ftemp = 0;
607 3940506b 2005-01-13 devnull }
608 3940506b 2005-01-13 devnull if(fdefine != 0) {
609 3940506b 2005-01-13 devnull Bterm(fdefine);
610 3940506b 2005-01-13 devnull fdefine = 0;
611 3940506b 2005-01-13 devnull }
612 3940506b 2005-01-13 devnull }
613 3940506b 2005-01-13 devnull
614 3940506b 2005-01-13 devnull /*
615 3940506b 2005-01-13 devnull * write out error comment -- NEEDS WORK
616 3940506b 2005-01-13 devnull */
617 3940506b 2005-01-13 devnull void
618 3940506b 2005-01-13 devnull error(char *s, ...)
619 3940506b 2005-01-13 devnull {
620 3940506b 2005-01-13 devnull va_list arg;
621 3940506b 2005-01-13 devnull
622 3940506b 2005-01-13 devnull nerrors++;
623 3940506b 2005-01-13 devnull fprint(2, "\n fatal error:");
624 3940506b 2005-01-13 devnull va_start(arg, s);
625 3940506b 2005-01-13 devnull vfprint(2, s, arg);
626 3940506b 2005-01-13 devnull va_end(arg);
627 3940506b 2005-01-13 devnull fprint(2, ", %s:%d\n", infile, lineno);
628 3940506b 2005-01-13 devnull if(!fatfl)
629 3940506b 2005-01-13 devnull return;
630 3940506b 2005-01-13 devnull summary();
631 3940506b 2005-01-13 devnull cleantmp();
632 3940506b 2005-01-13 devnull exits("error");
633 3940506b 2005-01-13 devnull }
634 3940506b 2005-01-13 devnull
635 3940506b 2005-01-13 devnull /*
636 3940506b 2005-01-13 devnull * set elements 0 through n-1 to c
637 3940506b 2005-01-13 devnull */
638 3940506b 2005-01-13 devnull void
639 3940506b 2005-01-13 devnull aryfil(int *v, int n, int c)
640 3940506b 2005-01-13 devnull {
641 3940506b 2005-01-13 devnull int i;
642 3940506b 2005-01-13 devnull
643 3940506b 2005-01-13 devnull for(i=0; i<n; i++)
644 3940506b 2005-01-13 devnull v[i] = c;
645 3940506b 2005-01-13 devnull }
646 3940506b 2005-01-13 devnull
647 3940506b 2005-01-13 devnull /*
648 3940506b 2005-01-13 devnull * set a to the union of a and b
649 3940506b 2005-01-13 devnull * return 1 if b is not a subset of a, 0 otherwise
650 3940506b 2005-01-13 devnull */
651 3940506b 2005-01-13 devnull int
652 3940506b 2005-01-13 devnull setunion(int *a, int *b)
653 3940506b 2005-01-13 devnull {
654 3940506b 2005-01-13 devnull int i, x, sub;
655 3940506b 2005-01-13 devnull
656 3940506b 2005-01-13 devnull sub = 0;
657 3940506b 2005-01-13 devnull SETLOOP(i) {
658 3940506b 2005-01-13 devnull x = *a;
659 3940506b 2005-01-13 devnull *a |= *b;
660 3940506b 2005-01-13 devnull if(*a != x)
661 3940506b 2005-01-13 devnull sub = 1;
662 3940506b 2005-01-13 devnull a++;
663 3940506b 2005-01-13 devnull b++;
664 3940506b 2005-01-13 devnull }
665 3940506b 2005-01-13 devnull return sub;
666 3940506b 2005-01-13 devnull }
667 3940506b 2005-01-13 devnull
668 3940506b 2005-01-13 devnull void
669 3940506b 2005-01-13 devnull prlook(Lkset* p)
670 3940506b 2005-01-13 devnull {
671 3940506b 2005-01-13 devnull int j, *pp;
672 3940506b 2005-01-13 devnull
673 3940506b 2005-01-13 devnull pp = p->lset;
674 3940506b 2005-01-13 devnull if(pp == 0)
675 3940506b 2005-01-13 devnull Bprint(foutput, "\tNULL");
676 3940506b 2005-01-13 devnull else {
677 3940506b 2005-01-13 devnull Bprint(foutput, " { ");
678 3940506b 2005-01-13 devnull TLOOP(j)
679 3940506b 2005-01-13 devnull if(BIT(pp,j))
680 3940506b 2005-01-13 devnull Bprint(foutput, "%s ", symnam(j));
681 3940506b 2005-01-13 devnull Bprint(foutput, "}");
682 3940506b 2005-01-13 devnull }
683 3940506b 2005-01-13 devnull }
684 3940506b 2005-01-13 devnull
685 3940506b 2005-01-13 devnull /*
686 3940506b 2005-01-13 devnull * compute an array with the beginnings of productions yielding given nonterminals
687 3940506b 2005-01-13 devnull * The array pres points to these lists
688 3940506b 2005-01-13 devnull * the array pyield has the lists: the total size is only NPROD+1
689 3940506b 2005-01-13 devnull */
690 3940506b 2005-01-13 devnull void
691 3940506b 2005-01-13 devnull cpres(void)
692 3940506b 2005-01-13 devnull {
693 3940506b 2005-01-13 devnull int c, j, i, **pmem;
694 3940506b 2005-01-13 devnull static int *pyield[NPROD];
695 3940506b 2005-01-13 devnull
696 3940506b 2005-01-13 devnull pmem = pyield;
697 3940506b 2005-01-13 devnull NTLOOP(i) {
698 3940506b 2005-01-13 devnull c = i+NTBASE;
699 3940506b 2005-01-13 devnull pres[i] = pmem;
700 3940506b 2005-01-13 devnull fatfl = 0; /* make undefined symbols nonfatal */
701 3940506b 2005-01-13 devnull PLOOP(0, j)
702 3940506b 2005-01-13 devnull if(*prdptr[j] == c)
703 3940506b 2005-01-13 devnull *pmem++ = prdptr[j]+1;
704 3940506b 2005-01-13 devnull if(pres[i] == pmem)
705 3940506b 2005-01-13 devnull error("nonterminal %s not defined!", nontrst[i].name);
706 3940506b 2005-01-13 devnull }
707 3940506b 2005-01-13 devnull pres[i] = pmem;
708 3940506b 2005-01-13 devnull fatfl = 1;
709 3940506b 2005-01-13 devnull if(nerrors) {
710 3940506b 2005-01-13 devnull summary();
711 3940506b 2005-01-13 devnull cleantmp();
712 3940506b 2005-01-13 devnull exits("error");
713 3940506b 2005-01-13 devnull }
714 3940506b 2005-01-13 devnull if(pmem != &pyield[nprod])
715 3940506b 2005-01-13 devnull error("internal Yacc error: pyield %d", pmem-&pyield[nprod]);
716 3940506b 2005-01-13 devnull }
717 3940506b 2005-01-13 devnull
718 3940506b 2005-01-13 devnull /*
719 3940506b 2005-01-13 devnull * compute an array with the first of nonterminals
720 3940506b 2005-01-13 devnull */
721 3940506b 2005-01-13 devnull void
722 3940506b 2005-01-13 devnull cpfir(void)
723 3940506b 2005-01-13 devnull {
724 3940506b 2005-01-13 devnull int *p, **s, i, **t, ch, changes;
725 3940506b 2005-01-13 devnull
726 3940506b 2005-01-13 devnull zzcwp = &wsets[nnonter];
727 3940506b 2005-01-13 devnull NTLOOP(i) {
728 3940506b 2005-01-13 devnull aryfil(wsets[i].ws.lset, tbitset, 0);
729 3940506b 2005-01-13 devnull t = pres[i+1];
730 3940506b 2005-01-13 devnull /* initially fill the sets */
731 3940506b 2005-01-13 devnull for(s=pres[i]; s<t; ++s)
732 3940506b 2005-01-13 devnull for(p = *s; (ch = *p) > 0; ++p) {
733 3940506b 2005-01-13 devnull if(ch < NTBASE) {
734 3940506b 2005-01-13 devnull SETBIT(wsets[i].ws.lset, ch);
735 3940506b 2005-01-13 devnull break;
736 3940506b 2005-01-13 devnull }
737 3940506b 2005-01-13 devnull if(!pempty[ch-NTBASE])
738 3940506b 2005-01-13 devnull break;
739 3940506b 2005-01-13 devnull }
740 3940506b 2005-01-13 devnull }
741 3940506b 2005-01-13 devnull
742 3940506b 2005-01-13 devnull /* now, reflect transitivity */
743 3940506b 2005-01-13 devnull changes = 1;
744 3940506b 2005-01-13 devnull while(changes) {
745 3940506b 2005-01-13 devnull changes = 0;
746 3940506b 2005-01-13 devnull NTLOOP(i) {
747 3940506b 2005-01-13 devnull t = pres[i+1];
748 3940506b 2005-01-13 devnull for(s = pres[i]; s < t; ++s)
749 3940506b 2005-01-13 devnull for(p = *s; (ch = (*p-NTBASE)) >= 0; ++p) {
750 3940506b 2005-01-13 devnull changes |= setunion(wsets[i].ws.lset, wsets[ch].ws.lset);
751 3940506b 2005-01-13 devnull if(!pempty[ch])
752 3940506b 2005-01-13 devnull break;
753 3940506b 2005-01-13 devnull }
754 3940506b 2005-01-13 devnull }
755 3940506b 2005-01-13 devnull }
756 3940506b 2005-01-13 devnull
757 3940506b 2005-01-13 devnull NTLOOP(i)
758 3940506b 2005-01-13 devnull pfirst[i] = flset(&wsets[i].ws);
759 3940506b 2005-01-13 devnull if(!indebug)
760 3940506b 2005-01-13 devnull return;
761 3940506b 2005-01-13 devnull if(foutput != 0)
762 3940506b 2005-01-13 devnull NTLOOP(i) {
763 3940506b 2005-01-13 devnull Bprint(foutput, "\n%s: ", nontrst[i].name);
764 3940506b 2005-01-13 devnull prlook(pfirst[i]);
765 3940506b 2005-01-13 devnull Bprint(foutput, " %d\n", pempty[i]);
766 3940506b 2005-01-13 devnull }
767 3940506b 2005-01-13 devnull }
768 3940506b 2005-01-13 devnull
769 3940506b 2005-01-13 devnull /*
770 3940506b 2005-01-13 devnull * sorts last state,and sees if it equals earlier ones. returns state number
771 3940506b 2005-01-13 devnull */
772 3940506b 2005-01-13 devnull int
773 3940506b 2005-01-13 devnull state(int c)
774 3940506b 2005-01-13 devnull {
775 3940506b 2005-01-13 devnull Item *p1, *p2, *k, *l, *q1, *q2;
776 3940506b 2005-01-13 devnull int size1, size2, i;
777 3940506b 2005-01-13 devnull
778 3940506b 2005-01-13 devnull p1 = pstate[nstate];
779 3940506b 2005-01-13 devnull p2 = pstate[nstate+1];
780 3940506b 2005-01-13 devnull if(p1 == p2)
781 3940506b 2005-01-13 devnull return 0; /* null state */
782 3940506b 2005-01-13 devnull /* sort the items */
783 3940506b 2005-01-13 devnull for(k = p2-1; k > p1; k--) /* make k the biggest */
784 3940506b 2005-01-13 devnull for(l = k-1; l >= p1; --l)
785 3940506b 2005-01-13 devnull if(l->pitem > k->pitem) {
786 3940506b 2005-01-13 devnull int *s;
787 3940506b 2005-01-13 devnull Lkset *ss;
788 3940506b 2005-01-13 devnull
789 3940506b 2005-01-13 devnull s = k->pitem;
790 3940506b 2005-01-13 devnull k->pitem = l->pitem;
791 3940506b 2005-01-13 devnull l->pitem = s;
792 3940506b 2005-01-13 devnull ss = k->look;
793 3940506b 2005-01-13 devnull k->look = l->look;
794 3940506b 2005-01-13 devnull l->look = ss;
795 3940506b 2005-01-13 devnull }
796 3940506b 2005-01-13 devnull size1 = p2 - p1; /* size of state */
797 3940506b 2005-01-13 devnull
798 3940506b 2005-01-13 devnull for(i = (c>=NTBASE)? ntstates[c-NTBASE]: tstates[c]; i != 0; i = mstates[i]) {
799 3940506b 2005-01-13 devnull /* get ith state */
800 3940506b 2005-01-13 devnull q1 = pstate[i];
801 3940506b 2005-01-13 devnull q2 = pstate[i+1];
802 3940506b 2005-01-13 devnull size2 = q2 - q1;
803 3940506b 2005-01-13 devnull if(size1 != size2)
804 3940506b 2005-01-13 devnull continue;
805 3940506b 2005-01-13 devnull k = p1;
806 3940506b 2005-01-13 devnull for(l = q1; l < q2; l++) {
807 3940506b 2005-01-13 devnull if(l->pitem != k->pitem)
808 3940506b 2005-01-13 devnull break;
809 3940506b 2005-01-13 devnull k++;
810 3940506b 2005-01-13 devnull }
811 3940506b 2005-01-13 devnull if(l != q2)
812 3940506b 2005-01-13 devnull continue;
813 3940506b 2005-01-13 devnull /* found it */
814 3940506b 2005-01-13 devnull pstate[nstate+1] = pstate[nstate]; /* delete last state */
815 3940506b 2005-01-13 devnull /* fix up lookaheads */
816 3940506b 2005-01-13 devnull if(nolook)
817 3940506b 2005-01-13 devnull return i;
818 3940506b 2005-01-13 devnull for(l = q1, k = p1; l < q2; ++l, ++k ) {
819 3940506b 2005-01-13 devnull int s;
820 3940506b 2005-01-13 devnull
821 3940506b 2005-01-13 devnull SETLOOP(s)
822 3940506b 2005-01-13 devnull clset.lset[s] = l->look->lset[s];
823 3940506b 2005-01-13 devnull if(setunion(clset.lset, k->look->lset)) {
824 3940506b 2005-01-13 devnull tystate[i] = MUSTDO;
825 3940506b 2005-01-13 devnull /* register the new set */
826 3940506b 2005-01-13 devnull l->look = flset( &clset );
827 3940506b 2005-01-13 devnull }
828 3940506b 2005-01-13 devnull }
829 3940506b 2005-01-13 devnull return i;
830 3940506b 2005-01-13 devnull }
831 3940506b 2005-01-13 devnull /* state is new */
832 3940506b 2005-01-13 devnull if(nolook)
833 3940506b 2005-01-13 devnull error("yacc state/nolook error");
834 3940506b 2005-01-13 devnull pstate[nstate+2] = p2;
835 3940506b 2005-01-13 devnull if(nstate+1 >= NSTATES)
836 3940506b 2005-01-13 devnull error("too many states");
837 3940506b 2005-01-13 devnull if(c >= NTBASE) {
838 3940506b 2005-01-13 devnull mstates[nstate] = ntstates[c-NTBASE];
839 3940506b 2005-01-13 devnull ntstates[c-NTBASE] = nstate;
840 3940506b 2005-01-13 devnull } else {
841 3940506b 2005-01-13 devnull mstates[nstate] = tstates[c];
842 3940506b 2005-01-13 devnull tstates[c] = nstate;
843 3940506b 2005-01-13 devnull }
844 3940506b 2005-01-13 devnull tystate[nstate] = MUSTDO;
845 3940506b 2005-01-13 devnull return nstate++;
846 3940506b 2005-01-13 devnull }
847 3940506b 2005-01-13 devnull
848 3940506b 2005-01-13 devnull void
849 3940506b 2005-01-13 devnull putitem(int *ptr, Lkset *lptr)
850 3940506b 2005-01-13 devnull {
851 3940506b 2005-01-13 devnull Item *j;
852 3940506b 2005-01-13 devnull
853 3940506b 2005-01-13 devnull if(pidebug && foutput != 0)
854 3940506b 2005-01-13 devnull Bprint(foutput, "putitem(%s), state %d\n", writem(ptr), nstate);
855 3940506b 2005-01-13 devnull j = pstate[nstate+1];
856 3940506b 2005-01-13 devnull j->pitem = ptr;
857 3940506b 2005-01-13 devnull if(!nolook)
858 3940506b 2005-01-13 devnull j->look = flset(lptr);
859 3940506b 2005-01-13 devnull pstate[nstate+1] = ++j;
860 3940506b 2005-01-13 devnull if((int*)j > zzmemsz) {
861 3940506b 2005-01-13 devnull zzmemsz = (int*)j;
862 3940506b 2005-01-13 devnull if(zzmemsz >= &mem0[MEMSIZE])
863 3940506b 2005-01-13 devnull error("out of state space");
864 3940506b 2005-01-13 devnull }
865 3940506b 2005-01-13 devnull }
866 3940506b 2005-01-13 devnull
867 3940506b 2005-01-13 devnull /*
868 3940506b 2005-01-13 devnull * mark nonterminals which derive the empty string
869 3940506b 2005-01-13 devnull * also, look for nonterminals which don't derive any token strings
870 3940506b 2005-01-13 devnull */
871 3940506b 2005-01-13 devnull void
872 3940506b 2005-01-13 devnull cempty(void)
873 3940506b 2005-01-13 devnull {
874 3940506b 2005-01-13 devnull
875 3940506b 2005-01-13 devnull int i, *p;
876 3940506b 2005-01-13 devnull
877 3940506b 2005-01-13 devnull /* first, use the array pempty to detect productions that can never be reduced */
878 3940506b 2005-01-13 devnull /* set pempty to WHONOWS */
879 3940506b 2005-01-13 devnull aryfil(pempty, nnonter+1, WHOKNOWS);
880 3940506b 2005-01-13 devnull
881 3940506b 2005-01-13 devnull /* now, look at productions, marking nonterminals which derive something */
882 3940506b 2005-01-13 devnull more:
883 3940506b 2005-01-13 devnull PLOOP(0, i) {
884 3940506b 2005-01-13 devnull if(pempty[*prdptr[i] - NTBASE])
885 3940506b 2005-01-13 devnull continue;
886 3940506b 2005-01-13 devnull for(p = prdptr[i]+1; *p >= 0; ++p)
887 3940506b 2005-01-13 devnull if(*p >= NTBASE && pempty[*p-NTBASE] == WHOKNOWS)
888 3940506b 2005-01-13 devnull break;
889 3940506b 2005-01-13 devnull /* production can be derived */
890 3940506b 2005-01-13 devnull if(*p < 0) {
891 3940506b 2005-01-13 devnull pempty[*prdptr[i]-NTBASE] = OK;
892 3940506b 2005-01-13 devnull goto more;
893 3940506b 2005-01-13 devnull }
894 3940506b 2005-01-13 devnull }
895 3940506b 2005-01-13 devnull
896 3940506b 2005-01-13 devnull /* now, look at the nonterminals, to see if they are all OK */
897 3940506b 2005-01-13 devnull NTLOOP(i) {
898 3940506b 2005-01-13 devnull /* the added production rises or falls as the start symbol ... */
899 3940506b 2005-01-13 devnull if(i == 0)
900 3940506b 2005-01-13 devnull continue;
901 3940506b 2005-01-13 devnull if(pempty[i] != OK) {
902 3940506b 2005-01-13 devnull fatfl = 0;
903 3940506b 2005-01-13 devnull error("nonterminal %s never derives any token string", nontrst[i].name);
904 3940506b 2005-01-13 devnull }
905 3940506b 2005-01-13 devnull }
906 3940506b 2005-01-13 devnull
907 3940506b 2005-01-13 devnull if(nerrors) {
908 3940506b 2005-01-13 devnull summary();
909 3940506b 2005-01-13 devnull cleantmp();
910 3940506b 2005-01-13 devnull exits("error");
911 3940506b 2005-01-13 devnull }
912 3940506b 2005-01-13 devnull
913 3940506b 2005-01-13 devnull /* now, compute the pempty array, to see which nonterminals derive the empty string */
914 3940506b 2005-01-13 devnull /* set pempty to WHOKNOWS */
915 3940506b 2005-01-13 devnull aryfil( pempty, nnonter+1, WHOKNOWS);
916 3940506b 2005-01-13 devnull
917 3940506b 2005-01-13 devnull /* loop as long as we keep finding empty nonterminals */
918 3940506b 2005-01-13 devnull
919 3940506b 2005-01-13 devnull again:
920 3940506b 2005-01-13 devnull PLOOP(1, i) {
921 3940506b 2005-01-13 devnull /* not known to be empty */
922 3940506b 2005-01-13 devnull if(pempty[*prdptr[i]-NTBASE] == WHOKNOWS) {
923 3940506b 2005-01-13 devnull for(p = prdptr[i]+1; *p >= NTBASE && pempty[*p-NTBASE] == EMPTY ; ++p)
924 3940506b 2005-01-13 devnull ;
925 3940506b 2005-01-13 devnull /* we have a nontrivially empty nonterminal */
926 3940506b 2005-01-13 devnull if(*p < 0) {
927 3940506b 2005-01-13 devnull pempty[*prdptr[i]-NTBASE] = EMPTY;
928 3940506b 2005-01-13 devnull /* got one ... try for another */
929 3940506b 2005-01-13 devnull goto again;
930 3940506b 2005-01-13 devnull }
931 3940506b 2005-01-13 devnull }
932 3940506b 2005-01-13 devnull }
933 3940506b 2005-01-13 devnull }
934 3940506b 2005-01-13 devnull
935 3940506b 2005-01-13 devnull /*
936 3940506b 2005-01-13 devnull * generate the states
937 3940506b 2005-01-13 devnull */
938 3940506b 2005-01-13 devnull void
939 3940506b 2005-01-13 devnull stagen(void)
940 3940506b 2005-01-13 devnull {
941 3940506b 2005-01-13 devnull
942 3940506b 2005-01-13 devnull int c, i, j, more;
943 3940506b 2005-01-13 devnull Wset *p, *q;
944 3940506b 2005-01-13 devnull
945 3940506b 2005-01-13 devnull /* initialize */
946 3940506b 2005-01-13 devnull nstate = 0;
947 3940506b 2005-01-13 devnull
948 3940506b 2005-01-13 devnull /* THIS IS FUNNY from the standpoint of portability
949 3940506b 2005-01-13 devnull * it represents the magic moment when the mem0 array, which has
950 3940506b 2005-01-13 devnull * been holding the productions, starts to hold item pointers, of a
951 3940506b 2005-01-13 devnull * different type...
952 3940506b 2005-01-13 devnull * someday, alloc should be used to allocate all this stuff... for now, we
953 3940506b 2005-01-13 devnull * accept that if pointers don't fit in integers, there is a problem...
954 3940506b 2005-01-13 devnull */
955 3940506b 2005-01-13 devnull
956 3940506b 2005-01-13 devnull pstate[0] = pstate[1] = (Item*)mem;
957 3940506b 2005-01-13 devnull aryfil(clset.lset, tbitset, 0);
958 3940506b 2005-01-13 devnull putitem(prdptr[0]+1, &clset);
959 3940506b 2005-01-13 devnull tystate[0] = MUSTDO;
960 3940506b 2005-01-13 devnull nstate = 1;
961 3940506b 2005-01-13 devnull pstate[2] = pstate[1];
962 3940506b 2005-01-13 devnull
963 3940506b 2005-01-13 devnull aryfil(amem, ACTSIZE, 0);
964 3940506b 2005-01-13 devnull
965 3940506b 2005-01-13 devnull /* now, the main state generation loop */
966 3940506b 2005-01-13 devnull for(more=1; more;) {
967 3940506b 2005-01-13 devnull more = 0;
968 3940506b 2005-01-13 devnull SLOOP(i) {
969 3940506b 2005-01-13 devnull if(tystate[i] != MUSTDO)
970 3940506b 2005-01-13 devnull continue;
971 3940506b 2005-01-13 devnull tystate[i] = DONE;
972 3940506b 2005-01-13 devnull aryfil(temp1, nnonter+1, 0);
973 3940506b 2005-01-13 devnull /* take state i, close it, and do gotos */
974 3940506b 2005-01-13 devnull closure(i);
975 3940506b 2005-01-13 devnull /* generate goto's */
976 3940506b 2005-01-13 devnull WSLOOP(wsets, p) {
977 3940506b 2005-01-13 devnull if(p->flag)
978 3940506b 2005-01-13 devnull continue;
979 3940506b 2005-01-13 devnull p->flag = 1;
980 3940506b 2005-01-13 devnull c = *(p->pitem);
981 3940506b 2005-01-13 devnull if(c <= 1) {
982 3940506b 2005-01-13 devnull if(pstate[i+1]-pstate[i] <= p-wsets)
983 3940506b 2005-01-13 devnull tystate[i] = MUSTLOOKAHEAD;
984 3940506b 2005-01-13 devnull continue;
985 3940506b 2005-01-13 devnull }
986 3940506b 2005-01-13 devnull /* do a goto on c */
987 3940506b 2005-01-13 devnull WSLOOP(p, q)
988 3940506b 2005-01-13 devnull /* this item contributes to the goto */
989 3940506b 2005-01-13 devnull if(c == *(q->pitem)) {
990 3940506b 2005-01-13 devnull putitem(q->pitem+1, &q->ws);
991 3940506b 2005-01-13 devnull q->flag = 1;
992 3940506b 2005-01-13 devnull }
993 3940506b 2005-01-13 devnull if(c < NTBASE)
994 3940506b 2005-01-13 devnull state(c); /* register new state */
995 3940506b 2005-01-13 devnull else
996 3940506b 2005-01-13 devnull temp1[c-NTBASE] = state(c);
997 3940506b 2005-01-13 devnull }
998 3940506b 2005-01-13 devnull if(gsdebug && foutput != 0) {
999 3940506b 2005-01-13 devnull Bprint(foutput, "%d: ", i);
1000 3940506b 2005-01-13 devnull NTLOOP(j)
1001 3940506b 2005-01-13 devnull if(temp1[j])
1002 3940506b 2005-01-13 devnull Bprint(foutput, "%s %d, ",
1003 3940506b 2005-01-13 devnull nontrst[j].name, temp1[j]);
1004 3940506b 2005-01-13 devnull Bprint(foutput, "\n");
1005 3940506b 2005-01-13 devnull }
1006 3940506b 2005-01-13 devnull indgo[i] = apack(&temp1[1], nnonter-1) - 1;
1007 3940506b 2005-01-13 devnull /* do some more */
1008 3940506b 2005-01-13 devnull more = 1;
1009 3940506b 2005-01-13 devnull }
1010 3940506b 2005-01-13 devnull }
1011 3940506b 2005-01-13 devnull }
1012 3940506b 2005-01-13 devnull
1013 3940506b 2005-01-13 devnull /*
1014 3940506b 2005-01-13 devnull * generate the closure of state i
1015 3940506b 2005-01-13 devnull */
1016 3940506b 2005-01-13 devnull void
1017 3940506b 2005-01-13 devnull closure(int i)
1018 3940506b 2005-01-13 devnull {
1019 3940506b 2005-01-13 devnull
1020 3940506b 2005-01-13 devnull Wset *u, *v;
1021 3940506b 2005-01-13 devnull Item *p, *q;
1022 3940506b 2005-01-13 devnull int c, ch, work, k, *pi, **s, **t;
1023 3940506b 2005-01-13 devnull
1024 3940506b 2005-01-13 devnull zzclose++;
1025 3940506b 2005-01-13 devnull
1026 3940506b 2005-01-13 devnull /* first, copy kernel of state i to wsets */
1027 3940506b 2005-01-13 devnull cwp = wsets;
1028 3940506b 2005-01-13 devnull ITMLOOP(i, p, q) {
1029 3940506b 2005-01-13 devnull cwp->pitem = p->pitem;
1030 3940506b 2005-01-13 devnull cwp->flag = 1; /* this item must get closed */
1031 3940506b 2005-01-13 devnull SETLOOP(k)
1032 3940506b 2005-01-13 devnull cwp->ws.lset[k] = p->look->lset[k];
1033 3940506b 2005-01-13 devnull WSBUMP(cwp);
1034 3940506b 2005-01-13 devnull }
1035 3940506b 2005-01-13 devnull
1036 3940506b 2005-01-13 devnull /* now, go through the loop, closing each item */
1037 3940506b 2005-01-13 devnull work = 1;
1038 3940506b 2005-01-13 devnull while(work) {
1039 3940506b 2005-01-13 devnull work = 0;
1040 3940506b 2005-01-13 devnull WSLOOP(wsets, u) {
1041 3940506b 2005-01-13 devnull if(u->flag == 0)
1042 3940506b 2005-01-13 devnull continue;
1043 3940506b 2005-01-13 devnull /* dot is before c */
1044 3940506b 2005-01-13 devnull c = *(u->pitem);
1045 3940506b 2005-01-13 devnull if(c < NTBASE) {
1046 3940506b 2005-01-13 devnull u->flag = 0;
1047 3940506b 2005-01-13 devnull /* only interesting case is where . is before nonterminal */
1048 3940506b 2005-01-13 devnull continue;
1049 3940506b 2005-01-13 devnull }
1050 3940506b 2005-01-13 devnull
1051 3940506b 2005-01-13 devnull /* compute the lookahead */
1052 3940506b 2005-01-13 devnull aryfil(clset.lset, tbitset, 0);
1053 3940506b 2005-01-13 devnull
1054 3940506b 2005-01-13 devnull /* find items involving c */
1055 3940506b 2005-01-13 devnull WSLOOP(u, v)
1056 3940506b 2005-01-13 devnull if(v->flag == 1 && *(pi=v->pitem) == c) {
1057 3940506b 2005-01-13 devnull v->flag = 0;
1058 3940506b 2005-01-13 devnull if(nolook)
1059 3940506b 2005-01-13 devnull continue;
1060 3940506b 2005-01-13 devnull while((ch = *++pi) > 0) {
1061 3940506b 2005-01-13 devnull /* terminal symbol */
1062 3940506b 2005-01-13 devnull if(ch < NTBASE) {
1063 3940506b 2005-01-13 devnull SETBIT(clset.lset, ch);
1064 3940506b 2005-01-13 devnull break;
1065 3940506b 2005-01-13 devnull }
1066 3940506b 2005-01-13 devnull /* nonterminal symbol */
1067 3940506b 2005-01-13 devnull setunion(clset.lset, pfirst[ch-NTBASE]->lset);
1068 3940506b 2005-01-13 devnull if(!pempty[ch-NTBASE])
1069 3940506b 2005-01-13 devnull break;
1070 3940506b 2005-01-13 devnull }
1071 3940506b 2005-01-13 devnull if(ch <= 0)
1072 3940506b 2005-01-13 devnull setunion(clset.lset, v->ws.lset);
1073 3940506b 2005-01-13 devnull }
1074 3940506b 2005-01-13 devnull
1075 3940506b 2005-01-13 devnull /*
1076 3940506b 2005-01-13 devnull * now loop over productions derived from c
1077 3940506b 2005-01-13 devnull * c is now nonterminal number
1078 3940506b 2005-01-13 devnull */
1079 3940506b 2005-01-13 devnull c -= NTBASE;
1080 3940506b 2005-01-13 devnull t = pres[c+1];
1081 3940506b 2005-01-13 devnull for(s = pres[c]; s < t; ++s) {
1082 3940506b 2005-01-13 devnull /*
1083 3940506b 2005-01-13 devnull * put these items into the closure
1084 3940506b 2005-01-13 devnull * is the item there
1085 3940506b 2005-01-13 devnull */
1086 3940506b 2005-01-13 devnull WSLOOP(wsets, v)
1087 3940506b 2005-01-13 devnull /* yes, it is there */
1088 3940506b 2005-01-13 devnull if(v->pitem == *s) {
1089 3940506b 2005-01-13 devnull if(nolook)
1090 3940506b 2005-01-13 devnull goto nexts;
1091 3940506b 2005-01-13 devnull if(setunion(v->ws.lset, clset.lset))
1092 3940506b 2005-01-13 devnull v->flag = work = 1;
1093 3940506b 2005-01-13 devnull goto nexts;
1094 3940506b 2005-01-13 devnull }
1095 3940506b 2005-01-13 devnull
1096 3940506b 2005-01-13 devnull /* not there; make a new entry */
1097 3940506b 2005-01-13 devnull if(cwp-wsets+1 >= WSETSIZE)
1098 3940506b 2005-01-13 devnull error( "working set overflow");
1099 3940506b 2005-01-13 devnull cwp->pitem = *s;
1100 3940506b 2005-01-13 devnull cwp->flag = 1;
1101 3940506b 2005-01-13 devnull if(!nolook) {
1102 3940506b 2005-01-13 devnull work = 1;
1103 3940506b 2005-01-13 devnull SETLOOP(k) cwp->ws.lset[k] = clset.lset[k];
1104 3940506b 2005-01-13 devnull }
1105 3940506b 2005-01-13 devnull WSBUMP(cwp);
1106 3940506b 2005-01-13 devnull
1107 3940506b 2005-01-13 devnull nexts:;
1108 3940506b 2005-01-13 devnull }
1109 3940506b 2005-01-13 devnull }
1110 3940506b 2005-01-13 devnull }
1111 3940506b 2005-01-13 devnull
1112 3940506b 2005-01-13 devnull /* have computed closure; flags are reset; return */
1113 3940506b 2005-01-13 devnull if(cwp > zzcwp)
1114 3940506b 2005-01-13 devnull zzcwp = cwp;
1115 3940506b 2005-01-13 devnull if(cldebug && foutput != 0) {
1116 3940506b 2005-01-13 devnull Bprint(foutput, "\nState %d, nolook = %d\n", i, nolook);
1117 3940506b 2005-01-13 devnull WSLOOP(wsets, u) {
1118 3940506b 2005-01-13 devnull if(u->flag)
1119 3940506b 2005-01-13 devnull Bprint(foutput, "flag set!\n");
1120 3940506b 2005-01-13 devnull u->flag = 0;
1121 3940506b 2005-01-13 devnull Bprint(foutput, "\t%s", writem(u->pitem));
1122 3940506b 2005-01-13 devnull prlook(&u->ws);
1123 3940506b 2005-01-13 devnull Bprint(foutput, "\n");
1124 3940506b 2005-01-13 devnull }
1125 3940506b 2005-01-13 devnull }
1126 3940506b 2005-01-13 devnull }
1127 3940506b 2005-01-13 devnull
1128 3940506b 2005-01-13 devnull /*
1129 3940506b 2005-01-13 devnull * decide if the lookahead set pointed to by p is known
1130 3940506b 2005-01-13 devnull * return pointer to a perminent location for the set
1131 3940506b 2005-01-13 devnull */
1132 3940506b 2005-01-13 devnull Lkset*
1133 3940506b 2005-01-13 devnull flset(Lkset *p)
1134 3940506b 2005-01-13 devnull {
1135 3940506b 2005-01-13 devnull Lkset *q;
1136 3940506b 2005-01-13 devnull int *u, *v, *w, j;
1137 3940506b 2005-01-13 devnull
1138 3940506b 2005-01-13 devnull for(q = &lkst[nlset]; q-- > lkst;) {
1139 3940506b 2005-01-13 devnull u = p->lset;
1140 3940506b 2005-01-13 devnull v = q->lset;
1141 3940506b 2005-01-13 devnull w = &v[tbitset];
1142 3940506b 2005-01-13 devnull while(v < w)
1143 3940506b 2005-01-13 devnull if(*u++ != *v++)
1144 3940506b 2005-01-13 devnull goto more;
1145 3940506b 2005-01-13 devnull /* we have matched */
1146 3940506b 2005-01-13 devnull return q;
1147 3940506b 2005-01-13 devnull more:;
1148 3940506b 2005-01-13 devnull }
1149 3940506b 2005-01-13 devnull /* add a new one */
1150 3940506b 2005-01-13 devnull q = &lkst[nlset++];
1151 3940506b 2005-01-13 devnull if(nlset >= LSETSIZE)
1152 3940506b 2005-01-13 devnull error("too many lookahead sets");
1153 3940506b 2005-01-13 devnull SETLOOP(j)
1154 3940506b 2005-01-13 devnull q->lset[j] = p->lset[j];
1155 3940506b 2005-01-13 devnull return q;
1156 3940506b 2005-01-13 devnull }
1157 3940506b 2005-01-13 devnull
1158 3940506b 2005-01-13 devnull void
1159 3940506b 2005-01-13 devnull cleantmp(void)
1160 3940506b 2005-01-13 devnull {
1161 3940506b 2005-01-13 devnull ZAPFILE(actname);
1162 3940506b 2005-01-13 devnull ZAPFILE(tempname);
1163 3940506b 2005-01-13 devnull }
1164 3940506b 2005-01-13 devnull
1165 3940506b 2005-01-13 devnull void
1166 3940506b 2005-01-13 devnull intr(void)
1167 3940506b 2005-01-13 devnull {
1168 3940506b 2005-01-13 devnull cleantmp();
1169 3940506b 2005-01-13 devnull exits("interrupted");
1170 3940506b 2005-01-13 devnull }
1171 3940506b 2005-01-13 devnull
1172 3940506b 2005-01-13 devnull void
1173 3940506b 2005-01-13 devnull setup(int argc, char *argv[])
1174 3940506b 2005-01-13 devnull {
1175 3940506b 2005-01-13 devnull long c, t;
1176 3940506b 2005-01-13 devnull int i, j, fd, lev, ty, ytab, *p;
1177 3940506b 2005-01-13 devnull int vflag, dflag, stem;
1178 3940506b 2005-01-13 devnull char actnm[8], *stemc, *s, dirbuf[128];
1179 3940506b 2005-01-13 devnull
1180 3940506b 2005-01-13 devnull ytab = 0;
1181 3940506b 2005-01-13 devnull vflag = 0;
1182 3940506b 2005-01-13 devnull dflag = 0;
1183 3940506b 2005-01-13 devnull stem = 0;
1184 3940506b 2005-01-13 devnull stemc = "y";
1185 3940506b 2005-01-13 devnull foutput = 0;
1186 3940506b 2005-01-13 devnull fdefine = 0;
1187 3940506b 2005-01-13 devnull fdebug = 0;
1188 3940506b 2005-01-13 devnull ARGBEGIN{
1189 3940506b 2005-01-13 devnull case 'v':
1190 3940506b 2005-01-13 devnull case 'V':
1191 3940506b 2005-01-13 devnull vflag++;
1192 3940506b 2005-01-13 devnull break;
1193 3940506b 2005-01-13 devnull case 'D':
1194 3940506b 2005-01-13 devnull yydebug = ARGF();
1195 3940506b 2005-01-13 devnull break;
1196 3940506b 2005-01-13 devnull case 'd':
1197 3940506b 2005-01-13 devnull dflag++;
1198 3940506b 2005-01-13 devnull break;
1199 3940506b 2005-01-13 devnull case 'o':
1200 3940506b 2005-01-13 devnull ytab++;
1201 3940506b 2005-01-13 devnull ytabc = ARGF();
1202 3940506b 2005-01-13 devnull break;
1203 3940506b 2005-01-13 devnull case 's':
1204 3940506b 2005-01-13 devnull stem++;
1205 3940506b 2005-01-13 devnull stemc = ARGF();
1206 3940506b 2005-01-13 devnull break;
1207 3940506b 2005-01-13 devnull case 'S':
1208 3940506b 2005-01-13 devnull parser = PARSERS;
1209 3940506b 2005-01-13 devnull break;
1210 3940506b 2005-01-13 devnull default:
1211 3940506b 2005-01-13 devnull error("illegal option: %c", ARGC());
1212 3940506b 2005-01-13 devnull }ARGEND
1213 3940506b 2005-01-13 devnull openup(stemc, dflag, vflag, ytab, ytabc);
1214 3940506b 2005-01-13 devnull
1215 3940506b 2005-01-13 devnull if((fd = mkstemp(ttempname)) >= 0){
1216 3940506b 2005-01-13 devnull tempname = ttempname;
1217 3940506b 2005-01-13 devnull ftemp = Bfdopen(fd, OWRITE);
1218 3940506b 2005-01-13 devnull }
1219 3940506b 2005-01-13 devnull if((fd = mkstemp(tactname)) >= 0){
1220 3940506b 2005-01-13 devnull actname = tactname;
1221 3940506b 2005-01-13 devnull faction = Bfdopen(fd, OWRITE);
1222 3940506b 2005-01-13 devnull }
1223 3940506b 2005-01-13 devnull if(ftemp == 0 || faction == 0)
1224 3940506b 2005-01-13 devnull error("cannot open temp file");
1225 3940506b 2005-01-13 devnull if(argc < 1)
1226 3940506b 2005-01-13 devnull error("no input file");
1227 3940506b 2005-01-13 devnull infile = argv[0];
1228 3940506b 2005-01-13 devnull if(infile[0] != '/' && getwd(dirbuf, sizeof dirbuf)!=nil){
1229 3940506b 2005-01-13 devnull i = strlen(infile)+1+strlen(dirbuf)+1+10;
1230 3940506b 2005-01-13 devnull s = malloc(i);
1231 3940506b 2005-01-13 devnull if(s != nil){
1232 3940506b 2005-01-13 devnull snprint(s, i, "%s/%s", dirbuf, infile);
1233 3940506b 2005-01-13 devnull cleanname(s);
1234 3940506b 2005-01-13 devnull infile = s;
1235 3940506b 2005-01-13 devnull }
1236 3940506b 2005-01-13 devnull }
1237 3940506b 2005-01-13 devnull finput = Bopen(infile, OREAD);
1238 3940506b 2005-01-13 devnull if(finput == 0)
1239 3940506b 2005-01-13 devnull error("cannot open '%s'", argv[0]);
1240 3940506b 2005-01-13 devnull cnamp = cnames;
1241 3940506b 2005-01-13 devnull
1242 3940506b 2005-01-13 devnull defin(0, "$end");
1243 3940506b 2005-01-13 devnull extval = PRIVATE; /* tokens start in unicode 'private use' */
1244 3940506b 2005-01-13 devnull defin(0, "error");
1245 3940506b 2005-01-13 devnull defin(1, "$accept");
1246 3940506b 2005-01-13 devnull defin(0, "$unk");
1247 3940506b 2005-01-13 devnull mem = mem0;
1248 3940506b 2005-01-13 devnull i = 0;
1249 3940506b 2005-01-13 devnull
1250 3940506b 2005-01-13 devnull for(t = gettok(); t != MARK && t != ENDFILE;)
1251 3940506b 2005-01-13 devnull switch(t) {
1252 3940506b 2005-01-13 devnull case ';':
1253 3940506b 2005-01-13 devnull t = gettok();
1254 3940506b 2005-01-13 devnull break;
1255 3940506b 2005-01-13 devnull
1256 3940506b 2005-01-13 devnull case START:
1257 3940506b 2005-01-13 devnull if(gettok() != IDENTIFIER)
1258 3940506b 2005-01-13 devnull error("bad %%start construction");
1259 3940506b 2005-01-13 devnull start = chfind(1, tokname);
1260 3940506b 2005-01-13 devnull t = gettok();
1261 3940506b 2005-01-13 devnull continue;
1262 3940506b 2005-01-13 devnull
1263 3940506b 2005-01-13 devnull case TYPEDEF:
1264 3940506b 2005-01-13 devnull if(gettok() != TYPENAME)
1265 3940506b 2005-01-13 devnull error("bad syntax in %%type");
1266 3940506b 2005-01-13 devnull ty = numbval;
1267 3940506b 2005-01-13 devnull for(;;) {
1268 3940506b 2005-01-13 devnull t = gettok();
1269 3940506b 2005-01-13 devnull switch(t) {
1270 3940506b 2005-01-13 devnull case IDENTIFIER:
1271 3940506b 2005-01-13 devnull if((t=chfind(1, tokname)) < NTBASE) {
1272 3940506b 2005-01-13 devnull j = TYPE(toklev[t]);
1273 3940506b 2005-01-13 devnull if(j != 0 && j != ty)
1274 3940506b 2005-01-13 devnull error("type redeclaration of token %s",
1275 3940506b 2005-01-13 devnull tokset[t].name);
1276 3940506b 2005-01-13 devnull else
1277 3940506b 2005-01-13 devnull SETTYPE(toklev[t], ty);
1278 3940506b 2005-01-13 devnull } else {
1279 3940506b 2005-01-13 devnull j = nontrst[t-NTBASE].value;
1280 3940506b 2005-01-13 devnull if(j != 0 && j != ty)
1281 3940506b 2005-01-13 devnull error("type redeclaration of nonterminal %s",
1282 3940506b 2005-01-13 devnull nontrst[t-NTBASE].name );
1283 3940506b 2005-01-13 devnull else
1284 3940506b 2005-01-13 devnull nontrst[t-NTBASE].value = ty;
1285 3940506b 2005-01-13 devnull }
1286 3940506b 2005-01-13 devnull case ',':
1287 3940506b 2005-01-13 devnull continue;
1288 3940506b 2005-01-13 devnull case ';':
1289 3940506b 2005-01-13 devnull t = gettok();
1290 3940506b 2005-01-13 devnull default:
1291 3940506b 2005-01-13 devnull break;
1292 3940506b 2005-01-13 devnull }
1293 3940506b 2005-01-13 devnull break;
1294 3940506b 2005-01-13 devnull }
1295 3940506b 2005-01-13 devnull continue;
1296 3940506b 2005-01-13 devnull
1297 3940506b 2005-01-13 devnull case UNION:
1298 3940506b 2005-01-13 devnull /* copy the union declaration to the output */
1299 3940506b 2005-01-13 devnull cpyunion();
1300 3940506b 2005-01-13 devnull t = gettok();
1301 3940506b 2005-01-13 devnull continue;
1302 3940506b 2005-01-13 devnull
1303 3940506b 2005-01-13 devnull case LEFT:
1304 3940506b 2005-01-13 devnull case BINARY:
1305 3940506b 2005-01-13 devnull case RIGHT:
1306 3940506b 2005-01-13 devnull i++;
1307 3940506b 2005-01-13 devnull
1308 3940506b 2005-01-13 devnull case TERM:
1309 3940506b 2005-01-13 devnull /* nonzero means new prec. and assoc. */
1310 3940506b 2005-01-13 devnull lev = t-TERM;
1311 3940506b 2005-01-13 devnull ty = 0;
1312 3940506b 2005-01-13 devnull
1313 3940506b 2005-01-13 devnull /* get identifiers so defined */
1314 3940506b 2005-01-13 devnull t = gettok();
1315 3940506b 2005-01-13 devnull
1316 3940506b 2005-01-13 devnull /* there is a type defined */
1317 3940506b 2005-01-13 devnull if(t == TYPENAME) {
1318 3940506b 2005-01-13 devnull ty = numbval;
1319 3940506b 2005-01-13 devnull t = gettok();
1320 3940506b 2005-01-13 devnull }
1321 3940506b 2005-01-13 devnull for(;;) {
1322 3940506b 2005-01-13 devnull switch(t) {
1323 3940506b 2005-01-13 devnull case ',':
1324 3940506b 2005-01-13 devnull t = gettok();
1325 3940506b 2005-01-13 devnull continue;
1326 3940506b 2005-01-13 devnull
1327 3940506b 2005-01-13 devnull case ';':
1328 3940506b 2005-01-13 devnull break;
1329 3940506b 2005-01-13 devnull
1330 3940506b 2005-01-13 devnull case IDENTIFIER:
1331 3940506b 2005-01-13 devnull j = chfind(0, tokname);
1332 3940506b 2005-01-13 devnull if(j >= NTBASE)
1333 3940506b 2005-01-13 devnull error("%s defined earlier as nonterminal", tokname);
1334 3940506b 2005-01-13 devnull if(lev) {
1335 3940506b 2005-01-13 devnull if(ASSOC(toklev[j]))
1336 3940506b 2005-01-13 devnull error("redeclaration of precedence of %s", tokname);
1337 3940506b 2005-01-13 devnull SETASC(toklev[j], lev);
1338 3940506b 2005-01-13 devnull SETPLEV(toklev[j], i);
1339 3940506b 2005-01-13 devnull }
1340 3940506b 2005-01-13 devnull if(ty) {
1341 3940506b 2005-01-13 devnull if(TYPE(toklev[j]))
1342 3940506b 2005-01-13 devnull error("redeclaration of type of %s", tokname);
1343 3940506b 2005-01-13 devnull SETTYPE(toklev[j],ty);
1344 3940506b 2005-01-13 devnull }
1345 3940506b 2005-01-13 devnull t = gettok();
1346 3940506b 2005-01-13 devnull if(t == NUMBER) {
1347 3940506b 2005-01-13 devnull tokset[j].value = numbval;
1348 3940506b 2005-01-13 devnull if(j < ndefout && j > 3)
1349 3940506b 2005-01-13 devnull error("please define type number of %s earlier",
1350 3940506b 2005-01-13 devnull tokset[j].name);
1351 3940506b 2005-01-13 devnull t = gettok();
1352 3940506b 2005-01-13 devnull }
1353 3940506b 2005-01-13 devnull continue;
1354 3940506b 2005-01-13 devnull }
1355 3940506b 2005-01-13 devnull break;
1356 3940506b 2005-01-13 devnull }
1357 3940506b 2005-01-13 devnull continue;
1358 3940506b 2005-01-13 devnull
1359 3940506b 2005-01-13 devnull case LCURLY:
1360 3940506b 2005-01-13 devnull defout(0);
1361 3940506b 2005-01-13 devnull cpycode();
1362 3940506b 2005-01-13 devnull t = gettok();
1363 3940506b 2005-01-13 devnull continue;
1364 3940506b 2005-01-13 devnull
1365 3940506b 2005-01-13 devnull default:
1366 3940506b 2005-01-13 devnull error("syntax error");
1367 3940506b 2005-01-13 devnull }
1368 3940506b 2005-01-13 devnull if(t == ENDFILE)
1369 3940506b 2005-01-13 devnull error("unexpected EOF before %%");
1370 3940506b 2005-01-13 devnull
1371 3940506b 2005-01-13 devnull /* t is MARK */
1372 3940506b 2005-01-13 devnull Bprint(ftable, "extern int yyerrflag;\n");
1373 3940506b 2005-01-13 devnull Bprint(ftable, "#ifndef YYMAXDEPTH\n");
1374 3940506b 2005-01-13 devnull Bprint(ftable, "#define YYMAXDEPTH 150\n");
1375 3940506b 2005-01-13 devnull Bprint(ftable, "#endif\n" );
1376 3940506b 2005-01-13 devnull if(!ntypes) {
1377 3940506b 2005-01-13 devnull Bprint(ftable, "#ifndef YYSTYPE\n");
1378 3940506b 2005-01-13 devnull Bprint(ftable, "#define YYSTYPE int\n");
1379 3940506b 2005-01-13 devnull Bprint(ftable, "#endif\n");
1380 3940506b 2005-01-13 devnull }
1381 3940506b 2005-01-13 devnull Bprint(ftable, "YYSTYPE yylval;\n");
1382 3940506b 2005-01-13 devnull Bprint(ftable, "YYSTYPE yyval;\n");
1383 3940506b 2005-01-13 devnull
1384 3940506b 2005-01-13 devnull prdptr[0] = mem;
1385 3940506b 2005-01-13 devnull
1386 3940506b 2005-01-13 devnull /* added production */
1387 3940506b 2005-01-13 devnull *mem++ = NTBASE;
1388 3940506b 2005-01-13 devnull
1389 3940506b 2005-01-13 devnull /* if start is 0, we will overwrite with the lhs of the first rule */
1390 3940506b 2005-01-13 devnull *mem++ = start;
1391 3940506b 2005-01-13 devnull *mem++ = 1;
1392 3940506b 2005-01-13 devnull *mem++ = 0;
1393 3940506b 2005-01-13 devnull prdptr[1] = mem;
1394 3940506b 2005-01-13 devnull while((t=gettok()) == LCURLY)
1395 3940506b 2005-01-13 devnull cpycode();
1396 3940506b 2005-01-13 devnull if(t != IDENTCOLON)
1397 3940506b 2005-01-13 devnull error("bad syntax on first rule");
1398 3940506b 2005-01-13 devnull
1399 3940506b 2005-01-13 devnull if(!start)
1400 3940506b 2005-01-13 devnull prdptr[0][1] = chfind(1, tokname);
1401 3940506b 2005-01-13 devnull
1402 3940506b 2005-01-13 devnull /* read rules */
1403 3940506b 2005-01-13 devnull while(t != MARK && t != ENDFILE) {
1404 3940506b 2005-01-13 devnull /* process a rule */
1405 3940506b 2005-01-13 devnull rlines[nprod] = lineno;
1406 3940506b 2005-01-13 devnull if(t == '|')
1407 3940506b 2005-01-13 devnull *mem++ = *prdptr[nprod-1];
1408 3940506b 2005-01-13 devnull else
1409 3940506b 2005-01-13 devnull if(t == IDENTCOLON) {
1410 3940506b 2005-01-13 devnull *mem = chfind(1, tokname);
1411 3940506b 2005-01-13 devnull if(*mem < NTBASE)
1412 3940506b 2005-01-13 devnull error("token illegal on LHS of grammar rule");
1413 3940506b 2005-01-13 devnull mem++;
1414 3940506b 2005-01-13 devnull } else
1415 3940506b 2005-01-13 devnull error("illegal rule: missing semicolon or | ?");
1416 3940506b 2005-01-13 devnull /* read rule body */
1417 3940506b 2005-01-13 devnull t = gettok();
1418 3940506b 2005-01-13 devnull
1419 3940506b 2005-01-13 devnull more_rule:
1420 3940506b 2005-01-13 devnull while(t == IDENTIFIER) {
1421 3940506b 2005-01-13 devnull *mem = chfind(1, tokname);
1422 3940506b 2005-01-13 devnull if(*mem < NTBASE)
1423 3940506b 2005-01-13 devnull levprd[nprod] = toklev[*mem];
1424 3940506b 2005-01-13 devnull mem++;
1425 3940506b 2005-01-13 devnull t = gettok();
1426 3940506b 2005-01-13 devnull }
1427 3940506b 2005-01-13 devnull if(t == PREC) {
1428 3940506b 2005-01-13 devnull if(gettok() != IDENTIFIER)
1429 3940506b 2005-01-13 devnull error("illegal %%prec syntax");
1430 3940506b 2005-01-13 devnull j = chfind(2, tokname);
1431 3940506b 2005-01-13 devnull if(j >= NTBASE)
1432 3940506b 2005-01-13 devnull error("nonterminal %s illegal after %%prec",
1433 3940506b 2005-01-13 devnull nontrst[j-NTBASE].name);
1434 3940506b 2005-01-13 devnull levprd[nprod] = toklev[j];
1435 3940506b 2005-01-13 devnull t = gettok();
1436 3940506b 2005-01-13 devnull }
1437 3940506b 2005-01-13 devnull if(t == '=') {
1438 3940506b 2005-01-13 devnull levprd[nprod] |= ACTFLAG;
1439 3940506b 2005-01-13 devnull Bprint(faction, "\ncase %d:", nprod);
1440 3940506b 2005-01-13 devnull cpyact(mem-prdptr[nprod]-1);
1441 3940506b 2005-01-13 devnull Bprint(faction, " break;");
1442 3940506b 2005-01-13 devnull if((t=gettok()) == IDENTIFIER) {
1443 3940506b 2005-01-13 devnull
1444 3940506b 2005-01-13 devnull /* action within rule... */
1445 3940506b 2005-01-13 devnull sprint(actnm, "$$%d", nprod);
1446 3940506b 2005-01-13 devnull
1447 3940506b 2005-01-13 devnull /* make it a nonterminal */
1448 3940506b 2005-01-13 devnull j = chfind(1, actnm);
1449 3940506b 2005-01-13 devnull
1450 3940506b 2005-01-13 devnull /*
1451 3940506b 2005-01-13 devnull * the current rule will become rule number nprod+1
1452 3940506b 2005-01-13 devnull * move the contents down, and make room for the null
1453 3940506b 2005-01-13 devnull */
1454 3940506b 2005-01-13 devnull for(p = mem; p >= prdptr[nprod]; --p)
1455 3940506b 2005-01-13 devnull p[2] = *p;
1456 3940506b 2005-01-13 devnull mem += 2;
1457 3940506b 2005-01-13 devnull
1458 3940506b 2005-01-13 devnull /* enter null production for action */
1459 3940506b 2005-01-13 devnull p = prdptr[nprod];
1460 3940506b 2005-01-13 devnull *p++ = j;
1461 3940506b 2005-01-13 devnull *p++ = -nprod;
1462 3940506b 2005-01-13 devnull
1463 3940506b 2005-01-13 devnull /* update the production information */
1464 3940506b 2005-01-13 devnull levprd[nprod+1] = levprd[nprod] & ~ACTFLAG;
1465 3940506b 2005-01-13 devnull levprd[nprod] = ACTFLAG;
1466 3940506b 2005-01-13 devnull if(++nprod >= NPROD)
1467 3940506b 2005-01-13 devnull error("more than %d rules", NPROD);
1468 3940506b 2005-01-13 devnull prdptr[nprod] = p;
1469 3940506b 2005-01-13 devnull
1470 3940506b 2005-01-13 devnull /* make the action appear in the original rule */
1471 3940506b 2005-01-13 devnull *mem++ = j;
1472 3940506b 2005-01-13 devnull
1473 3940506b 2005-01-13 devnull /* get some more of the rule */
1474 3940506b 2005-01-13 devnull goto more_rule;
1475 3940506b 2005-01-13 devnull }
1476 3940506b 2005-01-13 devnull }
1477 3940506b 2005-01-13 devnull
1478 3940506b 2005-01-13 devnull while(t == ';')
1479 3940506b 2005-01-13 devnull t = gettok();
1480 3940506b 2005-01-13 devnull *mem++ = -nprod;
1481 3940506b 2005-01-13 devnull
1482 3940506b 2005-01-13 devnull /* check that default action is reasonable */
1483 3940506b 2005-01-13 devnull if(ntypes && !(levprd[nprod]&ACTFLAG) && nontrst[*prdptr[nprod]-NTBASE].value) {
1484 3940506b 2005-01-13 devnull
1485 3940506b 2005-01-13 devnull /* no explicit action, LHS has value */
1486 3940506b 2005-01-13 devnull int tempty;
1487 3940506b 2005-01-13 devnull
1488 3940506b 2005-01-13 devnull tempty = prdptr[nprod][1];
1489 3940506b 2005-01-13 devnull if(tempty < 0)
1490 3940506b 2005-01-13 devnull error("must return a value, since LHS has a type");
1491 3940506b 2005-01-13 devnull else
1492 3940506b 2005-01-13 devnull if(tempty >= NTBASE)
1493 3940506b 2005-01-13 devnull tempty = nontrst[tempty-NTBASE].value;
1494 3940506b 2005-01-13 devnull else
1495 3940506b 2005-01-13 devnull tempty = TYPE(toklev[tempty]);
1496 3940506b 2005-01-13 devnull if(tempty != nontrst[*prdptr[nprod]-NTBASE].value)
1497 3940506b 2005-01-13 devnull error("default action causes potential type clash");
1498 3940506b 2005-01-13 devnull }
1499 3940506b 2005-01-13 devnull nprod++;
1500 3940506b 2005-01-13 devnull if(nprod >= NPROD)
1501 3940506b 2005-01-13 devnull error("more than %d rules", NPROD);
1502 3940506b 2005-01-13 devnull prdptr[nprod] = mem;
1503 3940506b 2005-01-13 devnull levprd[nprod] = 0;
1504 3940506b 2005-01-13 devnull }
1505 3940506b 2005-01-13 devnull
1506 3940506b 2005-01-13 devnull /* end of all rules */
1507 3940506b 2005-01-13 devnull defout(1);
1508 3940506b 2005-01-13 devnull
1509 3940506b 2005-01-13 devnull finact();
1510 3940506b 2005-01-13 devnull if(t == MARK) {
1511 3940506b 2005-01-13 devnull Bprint(ftable, "\n#line\t%d\t\"%s\"\n", lineno, infile);
1512 3940506b 2005-01-13 devnull while((c=Bgetrune(finput)) != Beof)
1513 3940506b 2005-01-13 devnull Bputrune(ftable, c);
1514 3940506b 2005-01-13 devnull }
1515 3940506b 2005-01-13 devnull Bterm(finput);
1516 3940506b 2005-01-13 devnull }
1517 3940506b 2005-01-13 devnull
1518 3940506b 2005-01-13 devnull /*
1519 3940506b 2005-01-13 devnull * finish action routine
1520 3940506b 2005-01-13 devnull */
1521 3940506b 2005-01-13 devnull void
1522 3940506b 2005-01-13 devnull finact(void)
1523 3940506b 2005-01-13 devnull {
1524 3940506b 2005-01-13 devnull
1525 3940506b 2005-01-13 devnull Bterm(faction);
1526 3940506b 2005-01-13 devnull Bprint(ftable, "#define YYEOFCODE %d\n", 1);
1527 3940506b 2005-01-13 devnull Bprint(ftable, "#define YYERRCODE %d\n", 2);
1528 3940506b 2005-01-13 devnull }
1529 3940506b 2005-01-13 devnull
1530 3940506b 2005-01-13 devnull /*
1531 3940506b 2005-01-13 devnull * define s to be a terminal if t=0
1532 3940506b 2005-01-13 devnull * or a nonterminal if t=1
1533 3940506b 2005-01-13 devnull */
1534 3940506b 2005-01-13 devnull int
1535 3940506b 2005-01-13 devnull defin(int nt, char *s)
1536 3940506b 2005-01-13 devnull {
1537 3940506b 2005-01-13 devnull int val;
1538 3940506b 2005-01-13 devnull Rune rune;
1539 3940506b 2005-01-13 devnull
1540 3940506b 2005-01-13 devnull val = 0;
1541 3940506b 2005-01-13 devnull if(nt) {
1542 3940506b 2005-01-13 devnull nnonter++;
1543 3940506b 2005-01-13 devnull if(nnonter >= NNONTERM)
1544 3940506b 2005-01-13 devnull error("too many nonterminals, limit %d",NNONTERM);
1545 3940506b 2005-01-13 devnull nontrst[nnonter].name = cstash(s);
1546 3940506b 2005-01-13 devnull return NTBASE + nnonter;
1547 3940506b 2005-01-13 devnull }
1548 3940506b 2005-01-13 devnull
1549 3940506b 2005-01-13 devnull /* must be a token */
1550 3940506b 2005-01-13 devnull ntokens++;
1551 3940506b 2005-01-13 devnull if(ntokens >= NTERMS)
1552 3940506b 2005-01-13 devnull error("too many terminals, limit %d", NTERMS);
1553 3940506b 2005-01-13 devnull tokset[ntokens].name = cstash(s);
1554 3940506b 2005-01-13 devnull
1555 3940506b 2005-01-13 devnull /* establish value for token */
1556 3940506b 2005-01-13 devnull /* single character literal */
1557 3940506b 2005-01-13 devnull if(s[0] == ' ') {
1558 3940506b 2005-01-13 devnull val = chartorune(&rune, &s[1]);
1559 3940506b 2005-01-13 devnull if(s[val+1] == 0) {
1560 3940506b 2005-01-13 devnull val = rune;
1561 3940506b 2005-01-13 devnull goto out;
1562 3940506b 2005-01-13 devnull }
1563 3940506b 2005-01-13 devnull }
1564 3940506b 2005-01-13 devnull
1565 3940506b 2005-01-13 devnull /* escape sequence */
1566 3940506b 2005-01-13 devnull if(s[0] == ' ' && s[1] == '\\') {
1567 3940506b 2005-01-13 devnull if(s[3] == 0) {
1568 3940506b 2005-01-13 devnull /* single character escape sequence */
1569 3940506b 2005-01-13 devnull switch(s[2]) {
1570 3940506b 2005-01-13 devnull case 'n': val = '\n'; break;
1571 3940506b 2005-01-13 devnull case 'r': val = '\r'; break;
1572 3940506b 2005-01-13 devnull case 'b': val = '\b'; break;
1573 3940506b 2005-01-13 devnull case 't': val = '\t'; break;
1574 3940506b 2005-01-13 devnull case 'f': val = '\f'; break;
1575 3940506b 2005-01-13 devnull case '\'': val = '\''; break;
1576 3940506b 2005-01-13 devnull case '"': val = '"'; break;
1577 3940506b 2005-01-13 devnull case '\\': val = '\\'; break;
1578 3940506b 2005-01-13 devnull default: error("invalid escape");
1579 3940506b 2005-01-13 devnull }
1580 3940506b 2005-01-13 devnull goto out;
1581 3940506b 2005-01-13 devnull }
1582 3940506b 2005-01-13 devnull
1583 3940506b 2005-01-13 devnull /* \nnn sequence */
1584 3940506b 2005-01-13 devnull if(s[2] >= '0' && s[2] <= '7') {
1585 3940506b 2005-01-13 devnull if(s[3] < '0' ||
1586 3940506b 2005-01-13 devnull s[3] > '7' ||
1587 3940506b 2005-01-13 devnull s[4] < '0' ||
1588 3940506b 2005-01-13 devnull s[4] > '7' ||
1589 3940506b 2005-01-13 devnull s[5] != 0)
1590 3940506b 2005-01-13 devnull error("illegal \\nnn construction");
1591 3940506b 2005-01-13 devnull val = 64*s[2] + 8*s[3] + s[4] - 73*'0';
1592 3940506b 2005-01-13 devnull if(val == 0)
1593 3940506b 2005-01-13 devnull error("'\\000' is illegal");
1594 3940506b 2005-01-13 devnull goto out;
1595 3940506b 2005-01-13 devnull }
1596 3940506b 2005-01-13 devnull error("unknown escape");
1597 3940506b 2005-01-13 devnull }
1598 3940506b 2005-01-13 devnull val = extval++;
1599 3940506b 2005-01-13 devnull
1600 3940506b 2005-01-13 devnull out:
1601 3940506b 2005-01-13 devnull tokset[ntokens].value = val;
1602 3940506b 2005-01-13 devnull toklev[ntokens] = 0;
1603 3940506b 2005-01-13 devnull return ntokens;
1604 3940506b 2005-01-13 devnull }
1605 3940506b 2005-01-13 devnull
1606 3940506b 2005-01-13 devnull /*
1607 3940506b 2005-01-13 devnull * write out the defines (at the end of the declaration section)
1608 3940506b 2005-01-13 devnull */
1609 3940506b 2005-01-13 devnull void
1610 3940506b 2005-01-13 devnull defout(int last)
1611 3940506b 2005-01-13 devnull {
1612 3940506b 2005-01-13 devnull int i, c;
1613 3940506b 2005-01-13 devnull char sar[NAMESIZE+10];
1614 3940506b 2005-01-13 devnull
1615 3940506b 2005-01-13 devnull for(i=ndefout; i<=ntokens; i++) {
1616 3940506b 2005-01-13 devnull /* non-literals */
1617 3940506b 2005-01-13 devnull c = tokset[i].name[0];
1618 3940506b 2005-01-13 devnull if(c != ' ' && c != '$') {
1619 3940506b 2005-01-13 devnull Bprint(ftable, "#define %s %d\n",
1620 3940506b 2005-01-13 devnull tokset[i].name, tokset[i].value);
1621 3940506b 2005-01-13 devnull if(fdefine)
1622 3940506b 2005-01-13 devnull Bprint(fdefine, "#define\t%s\t%d\n",
1623 3940506b 2005-01-13 devnull tokset[i].name, tokset[i].value);
1624 3940506b 2005-01-13 devnull }
1625 3940506b 2005-01-13 devnull }
1626 3940506b 2005-01-13 devnull ndefout = ntokens+1;
1627 3940506b 2005-01-13 devnull if(last && fdebug) {
1628 3940506b 2005-01-13 devnull Bprint(fdebug, "char* yytoknames[] =\n{\n");
1629 3940506b 2005-01-13 devnull TLOOP(i) {
1630 3940506b 2005-01-13 devnull if(tokset[i].name) {
1631 3940506b 2005-01-13 devnull chcopy(sar, tokset[i].name);
1632 3940506b 2005-01-13 devnull Bprint(fdebug, "\t\"%s\",\n", sar);
1633 3940506b 2005-01-13 devnull continue;
1634 3940506b 2005-01-13 devnull }
1635 3940506b 2005-01-13 devnull Bprint(fdebug, "\t0,\n");
1636 3940506b 2005-01-13 devnull }
1637 3940506b 2005-01-13 devnull Bprint(fdebug, "};\n");
1638 3940506b 2005-01-13 devnull }
1639 3940506b 2005-01-13 devnull }
1640 3940506b 2005-01-13 devnull
1641 3940506b 2005-01-13 devnull char*
1642 3940506b 2005-01-13 devnull cstash(char *s)
1643 3940506b 2005-01-13 devnull {
1644 3940506b 2005-01-13 devnull char *temp;
1645 3940506b 2005-01-13 devnull
1646 3940506b 2005-01-13 devnull temp = cnamp;
1647 3940506b 2005-01-13 devnull do {
1648 3940506b 2005-01-13 devnull if(cnamp >= &cnames[cnamsz])
1649 3940506b 2005-01-13 devnull error("too many characters in id's and literals");
1650 3940506b 2005-01-13 devnull else
1651 3940506b 2005-01-13 devnull *cnamp++ = *s;
1652 3940506b 2005-01-13 devnull } while(*s++);
1653 3940506b 2005-01-13 devnull return temp;
1654 3940506b 2005-01-13 devnull }
1655 3940506b 2005-01-13 devnull
1656 3940506b 2005-01-13 devnull long
1657 3940506b 2005-01-13 devnull gettok(void)
1658 3940506b 2005-01-13 devnull {
1659 3940506b 2005-01-13 devnull long c;
1660 3940506b 2005-01-13 devnull Rune rune;
1661 3940506b 2005-01-13 devnull int i, base, match, reserve;
1662 3940506b 2005-01-13 devnull static int peekline;
1663 3940506b 2005-01-13 devnull
1664 3940506b 2005-01-13 devnull begin:
1665 3940506b 2005-01-13 devnull reserve = 0;
1666 3940506b 2005-01-13 devnull lineno += peekline;
1667 3940506b 2005-01-13 devnull peekline = 0;
1668 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1669 3940506b 2005-01-13 devnull while(c == ' ' || c == '\n' || c == '\t' || c == '\f') {
1670 3940506b 2005-01-13 devnull if(c == '\n')
1671 3940506b 2005-01-13 devnull lineno++;
1672 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1673 3940506b 2005-01-13 devnull }
1674 3940506b 2005-01-13 devnull
1675 3940506b 2005-01-13 devnull /* skip comment */
1676 3940506b 2005-01-13 devnull if(c == '/') {
1677 3940506b 2005-01-13 devnull lineno += skipcom();
1678 3940506b 2005-01-13 devnull goto begin;
1679 3940506b 2005-01-13 devnull }
1680 3940506b 2005-01-13 devnull switch(c) {
1681 3940506b 2005-01-13 devnull case Beof:
1682 3940506b 2005-01-13 devnull return ENDFILE;
1683 3940506b 2005-01-13 devnull
1684 3940506b 2005-01-13 devnull case '{':
1685 3940506b 2005-01-13 devnull Bungetrune(finput);
1686 3940506b 2005-01-13 devnull return '=';
1687 3940506b 2005-01-13 devnull
1688 3940506b 2005-01-13 devnull case '<':
1689 3940506b 2005-01-13 devnull /* get, and look up, a type name (union member name) */
1690 3940506b 2005-01-13 devnull i = 0;
1691 3940506b 2005-01-13 devnull while((c=Bgetrune(finput)) != '>' && c >= 0 && c != '\n') {
1692 3940506b 2005-01-13 devnull rune = c;
1693 3940506b 2005-01-13 devnull c = runetochar(&tokname[i], &rune);
1694 3940506b 2005-01-13 devnull if(i < NAMESIZE)
1695 3940506b 2005-01-13 devnull i += c;
1696 3940506b 2005-01-13 devnull }
1697 3940506b 2005-01-13 devnull if(c != '>')
1698 3940506b 2005-01-13 devnull error("unterminated < ... > clause");
1699 3940506b 2005-01-13 devnull tokname[i] = 0;
1700 3940506b 2005-01-13 devnull for(i=1; i<=ntypes; i++)
1701 3940506b 2005-01-13 devnull if(!strcmp(typeset[i], tokname)) {
1702 3940506b 2005-01-13 devnull numbval = i;
1703 3940506b 2005-01-13 devnull return TYPENAME;
1704 3940506b 2005-01-13 devnull }
1705 3940506b 2005-01-13 devnull ntypes++;
1706 3940506b 2005-01-13 devnull numbval = ntypes;
1707 3940506b 2005-01-13 devnull typeset[numbval] = cstash(tokname);
1708 3940506b 2005-01-13 devnull return TYPENAME;
1709 3940506b 2005-01-13 devnull
1710 3940506b 2005-01-13 devnull case '"':
1711 3940506b 2005-01-13 devnull case '\'':
1712 3940506b 2005-01-13 devnull match = c;
1713 3940506b 2005-01-13 devnull tokname[0] = ' ';
1714 3940506b 2005-01-13 devnull i = 1;
1715 3940506b 2005-01-13 devnull for(;;) {
1716 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1717 3940506b 2005-01-13 devnull if(c == '\n' || c <= 0)
1718 3940506b 2005-01-13 devnull error("illegal or missing ' or \"" );
1719 3940506b 2005-01-13 devnull if(c == '\\') {
1720 3940506b 2005-01-13 devnull tokname[i] = '\\';
1721 3940506b 2005-01-13 devnull if(i < NAMESIZE)
1722 3940506b 2005-01-13 devnull i++;
1723 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1724 3940506b 2005-01-13 devnull } else
1725 3940506b 2005-01-13 devnull if(c == match)
1726 3940506b 2005-01-13 devnull break;
1727 3940506b 2005-01-13 devnull rune = c;
1728 3940506b 2005-01-13 devnull c = runetochar(&tokname[i], &rune);
1729 3940506b 2005-01-13 devnull if(i < NAMESIZE)
1730 3940506b 2005-01-13 devnull i += c;
1731 3940506b 2005-01-13 devnull }
1732 3940506b 2005-01-13 devnull break;
1733 3940506b 2005-01-13 devnull
1734 3940506b 2005-01-13 devnull case '%':
1735 3940506b 2005-01-13 devnull case '\\':
1736 3940506b 2005-01-13 devnull switch(c = Bgetrune(finput)) {
1737 3940506b 2005-01-13 devnull case '0': return TERM;
1738 3940506b 2005-01-13 devnull case '<': return LEFT;
1739 3940506b 2005-01-13 devnull case '2': return BINARY;
1740 3940506b 2005-01-13 devnull case '>': return RIGHT;
1741 3940506b 2005-01-13 devnull case '%':
1742 3940506b 2005-01-13 devnull case '\\': return MARK;
1743 3940506b 2005-01-13 devnull case '=': return PREC;
1744 3940506b 2005-01-13 devnull case '{': return LCURLY;
1745 3940506b 2005-01-13 devnull default: reserve = 1;
1746 3940506b 2005-01-13 devnull }
1747 3940506b 2005-01-13 devnull
1748 3940506b 2005-01-13 devnull default:
1749 3940506b 2005-01-13 devnull /* number */
1750 3940506b 2005-01-13 devnull if(isdigit(c)) {
1751 3940506b 2005-01-13 devnull numbval = c-'0';
1752 3940506b 2005-01-13 devnull base = (c=='0')? 8: 10;
1753 3940506b 2005-01-13 devnull for(c = Bgetrune(finput); isdigit(c); c = Bgetrune(finput))
1754 3940506b 2005-01-13 devnull numbval = numbval*base + (c-'0');
1755 3940506b 2005-01-13 devnull Bungetrune(finput);
1756 3940506b 2005-01-13 devnull return NUMBER;
1757 3940506b 2005-01-13 devnull }
1758 3940506b 2005-01-13 devnull if(islower(c) || isupper(c) || c=='_' || c=='.' || c=='$') {
1759 3940506b 2005-01-13 devnull i = 0;
1760 3940506b 2005-01-13 devnull while(islower(c) || isupper(c) || isdigit(c) ||
1761 3940506b 2005-01-13 devnull c == '-' || c=='_' || c=='.' || c=='$') {
1762 3940506b 2005-01-13 devnull if(reserve && isupper(c))
1763 3940506b 2005-01-13 devnull c += 'a'-'A';
1764 3940506b 2005-01-13 devnull rune = c;
1765 3940506b 2005-01-13 devnull c = runetochar(&tokname[i], &rune);
1766 3940506b 2005-01-13 devnull if(i < NAMESIZE)
1767 3940506b 2005-01-13 devnull i += c;
1768 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1769 3940506b 2005-01-13 devnull }
1770 3940506b 2005-01-13 devnull } else
1771 3940506b 2005-01-13 devnull return c;
1772 3940506b 2005-01-13 devnull Bungetrune(finput);
1773 3940506b 2005-01-13 devnull }
1774 3940506b 2005-01-13 devnull tokname[i] = 0;
1775 3940506b 2005-01-13 devnull
1776 3940506b 2005-01-13 devnull /* find a reserved word */
1777 3940506b 2005-01-13 devnull if(reserve) {
1778 3940506b 2005-01-13 devnull for(c=0; resrv[c].name; c++)
1779 3940506b 2005-01-13 devnull if(strcmp(tokname, resrv[c].name) == 0)
1780 3940506b 2005-01-13 devnull return resrv[c].value;
1781 3940506b 2005-01-13 devnull error("invalid escape, or illegal reserved word: %s", tokname);
1782 3940506b 2005-01-13 devnull }
1783 3940506b 2005-01-13 devnull
1784 3940506b 2005-01-13 devnull /* look ahead to distinguish IDENTIFIER from IDENTCOLON */
1785 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1786 3940506b 2005-01-13 devnull while(c == ' ' || c == '\t'|| c == '\n' || c == '\f' || c == '/') {
1787 3940506b 2005-01-13 devnull if(c == '\n')
1788 3940506b 2005-01-13 devnull peekline++;
1789 3940506b 2005-01-13 devnull /* look for comments */
1790 3940506b 2005-01-13 devnull if(c == '/')
1791 3940506b 2005-01-13 devnull peekline += skipcom();
1792 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1793 3940506b 2005-01-13 devnull }
1794 3940506b 2005-01-13 devnull if(c == ':')
1795 3940506b 2005-01-13 devnull return IDENTCOLON;
1796 3940506b 2005-01-13 devnull Bungetrune(finput);
1797 3940506b 2005-01-13 devnull return IDENTIFIER;
1798 3940506b 2005-01-13 devnull }
1799 3940506b 2005-01-13 devnull
1800 3940506b 2005-01-13 devnull /*
1801 3940506b 2005-01-13 devnull * determine the type of a symbol
1802 3940506b 2005-01-13 devnull */
1803 3940506b 2005-01-13 devnull int
1804 3940506b 2005-01-13 devnull fdtype(int t)
1805 3940506b 2005-01-13 devnull {
1806 3940506b 2005-01-13 devnull int v;
1807 3940506b 2005-01-13 devnull
1808 3940506b 2005-01-13 devnull if(t >= NTBASE)
1809 3940506b 2005-01-13 devnull v = nontrst[t-NTBASE].value;
1810 3940506b 2005-01-13 devnull else
1811 3940506b 2005-01-13 devnull v = TYPE(toklev[t]);
1812 3940506b 2005-01-13 devnull if(v <= 0)
1813 3940506b 2005-01-13 devnull error("must specify type for %s", (t>=NTBASE)?
1814 3940506b 2005-01-13 devnull nontrst[t-NTBASE].name: tokset[t].name);
1815 3940506b 2005-01-13 devnull return v;
1816 3940506b 2005-01-13 devnull }
1817 3940506b 2005-01-13 devnull
1818 3940506b 2005-01-13 devnull int
1819 3940506b 2005-01-13 devnull chfind(int t, char *s)
1820 3940506b 2005-01-13 devnull {
1821 3940506b 2005-01-13 devnull int i;
1822 3940506b 2005-01-13 devnull
1823 3940506b 2005-01-13 devnull if(s[0] == ' ')
1824 3940506b 2005-01-13 devnull t = 0;
1825 3940506b 2005-01-13 devnull TLOOP(i)
1826 3940506b 2005-01-13 devnull if(!strcmp(s, tokset[i].name))
1827 3940506b 2005-01-13 devnull return i;
1828 3940506b 2005-01-13 devnull NTLOOP(i)
1829 3940506b 2005-01-13 devnull if(!strcmp(s, nontrst[i].name))
1830 3940506b 2005-01-13 devnull return NTBASE+i;
1831 3940506b 2005-01-13 devnull
1832 3940506b 2005-01-13 devnull /* cannot find name */
1833 3940506b 2005-01-13 devnull if(t > 1)
1834 3940506b 2005-01-13 devnull error("%s should have been defined earlier", s);
1835 3940506b 2005-01-13 devnull return defin(t, s);
1836 3940506b 2005-01-13 devnull }
1837 3940506b 2005-01-13 devnull
1838 3940506b 2005-01-13 devnull /*
1839 3940506b 2005-01-13 devnull * copy the union declaration to the output, and the define file if present
1840 3940506b 2005-01-13 devnull */
1841 3940506b 2005-01-13 devnull void
1842 3940506b 2005-01-13 devnull cpyunion(void)
1843 3940506b 2005-01-13 devnull {
1844 3940506b 2005-01-13 devnull long c;
1845 3940506b 2005-01-13 devnull int level;
1846 3940506b 2005-01-13 devnull
1847 3940506b 2005-01-13 devnull Bprint(ftable, "\n#line\t%d\t\"%s\"\n", lineno, infile);
1848 3940506b 2005-01-13 devnull Bprint(ftable, "typedef union ");
1849 3940506b 2005-01-13 devnull if(fdefine != 0)
1850 3940506b 2005-01-13 devnull Bprint(fdefine, "\ntypedef union ");
1851 3940506b 2005-01-13 devnull
1852 3940506b 2005-01-13 devnull level = 0;
1853 3940506b 2005-01-13 devnull for(;;) {
1854 3940506b 2005-01-13 devnull if((c=Bgetrune(finput)) == Beof)
1855 3940506b 2005-01-13 devnull error("EOF encountered while processing %%union");
1856 3940506b 2005-01-13 devnull Bputrune(ftable, c);
1857 3940506b 2005-01-13 devnull if(fdefine != 0)
1858 3940506b 2005-01-13 devnull Bputrune(fdefine, c);
1859 3940506b 2005-01-13 devnull switch(c) {
1860 3940506b 2005-01-13 devnull case '\n':
1861 3940506b 2005-01-13 devnull lineno++;
1862 3940506b 2005-01-13 devnull break;
1863 3940506b 2005-01-13 devnull case '{':
1864 3940506b 2005-01-13 devnull level++;
1865 3940506b 2005-01-13 devnull break;
1866 3940506b 2005-01-13 devnull case '}':
1867 3940506b 2005-01-13 devnull level--;
1868 3940506b 2005-01-13 devnull
1869 3940506b 2005-01-13 devnull /* we are finished copying */
1870 3940506b 2005-01-13 devnull if(level == 0) {
1871 3940506b 2005-01-13 devnull Bprint(ftable, " YYSTYPE;\n");
1872 3940506b 2005-01-13 devnull if(fdefine != 0)
1873 3940506b 2005-01-13 devnull Bprint(fdefine, "\tYYSTYPE;\nextern\tYYSTYPE\tyylval;\n");
1874 3940506b 2005-01-13 devnull return;
1875 3940506b 2005-01-13 devnull }
1876 3940506b 2005-01-13 devnull }
1877 3940506b 2005-01-13 devnull }
1878 3940506b 2005-01-13 devnull }
1879 3940506b 2005-01-13 devnull
1880 3940506b 2005-01-13 devnull /*
1881 3940506b 2005-01-13 devnull * copies code between \{ and \}
1882 3940506b 2005-01-13 devnull */
1883 3940506b 2005-01-13 devnull void
1884 3940506b 2005-01-13 devnull cpycode(void)
1885 3940506b 2005-01-13 devnull {
1886 3940506b 2005-01-13 devnull
1887 3940506b 2005-01-13 devnull long c;
1888 3940506b 2005-01-13 devnull
1889 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1890 3940506b 2005-01-13 devnull if(c == '\n') {
1891 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1892 3940506b 2005-01-13 devnull lineno++;
1893 3940506b 2005-01-13 devnull }
1894 3940506b 2005-01-13 devnull Bprint(ftable, "\n#line\t%d\t\"%s\"\n", lineno, infile);
1895 3940506b 2005-01-13 devnull while(c != Beof) {
1896 3940506b 2005-01-13 devnull if(c == '\\') {
1897 3940506b 2005-01-13 devnull if((c=Bgetrune(finput)) == '}')
1898 3940506b 2005-01-13 devnull return;
1899 3940506b 2005-01-13 devnull Bputc(ftable, '\\');
1900 3940506b 2005-01-13 devnull }
1901 3940506b 2005-01-13 devnull if(c == '%') {
1902 3940506b 2005-01-13 devnull if((c=Bgetrune(finput)) == '}')
1903 3940506b 2005-01-13 devnull return;
1904 3940506b 2005-01-13 devnull Bputc(ftable, '%');
1905 3940506b 2005-01-13 devnull }
1906 3940506b 2005-01-13 devnull Bputrune(ftable, c);
1907 3940506b 2005-01-13 devnull if(c == '\n')
1908 3940506b 2005-01-13 devnull lineno++;
1909 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1910 3940506b 2005-01-13 devnull }
1911 3940506b 2005-01-13 devnull error("eof before %%}");
1912 3940506b 2005-01-13 devnull }
1913 3940506b 2005-01-13 devnull
1914 3940506b 2005-01-13 devnull /*
1915 3940506b 2005-01-13 devnull * skip over comments
1916 3940506b 2005-01-13 devnull * skipcom is called after reading a '/'
1917 3940506b 2005-01-13 devnull */
1918 3940506b 2005-01-13 devnull int
1919 3940506b 2005-01-13 devnull skipcom(void)
1920 3940506b 2005-01-13 devnull {
1921 3940506b 2005-01-13 devnull long c;
1922 3940506b 2005-01-13 devnull int i;
1923 3940506b 2005-01-13 devnull
1924 3940506b 2005-01-13 devnull /* i is the number of lines skipped */
1925 3940506b 2005-01-13 devnull i = 0;
1926 3940506b 2005-01-13 devnull if(Bgetrune(finput) != '*')
1927 3940506b 2005-01-13 devnull error("illegal comment");
1928 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1929 3940506b 2005-01-13 devnull while(c != Beof) {
1930 3940506b 2005-01-13 devnull while(c == '*')
1931 3940506b 2005-01-13 devnull if((c=Bgetrune(finput)) == '/')
1932 3940506b 2005-01-13 devnull return i;
1933 3940506b 2005-01-13 devnull if(c == '\n')
1934 3940506b 2005-01-13 devnull i++;
1935 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1936 3940506b 2005-01-13 devnull }
1937 3940506b 2005-01-13 devnull error("EOF inside comment");
1938 3940506b 2005-01-13 devnull return 0;
1939 3940506b 2005-01-13 devnull }
1940 3940506b 2005-01-13 devnull
1941 3940506b 2005-01-13 devnull /*
1942 3940506b 2005-01-13 devnull * copy C action to the next ; or closing }
1943 3940506b 2005-01-13 devnull */
1944 3940506b 2005-01-13 devnull void
1945 3940506b 2005-01-13 devnull cpyact(int offset)
1946 3940506b 2005-01-13 devnull {
1947 3940506b 2005-01-13 devnull long c;
1948 3940506b 2005-01-13 devnull int brac, match, j, s, fnd, tok;
1949 3940506b 2005-01-13 devnull
1950 3940506b 2005-01-13 devnull Bprint(faction, "\n#line\t%d\t\"%s\"\n", lineno, infile);
1951 3940506b 2005-01-13 devnull brac = 0;
1952 3940506b 2005-01-13 devnull
1953 3940506b 2005-01-13 devnull loop:
1954 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1955 3940506b 2005-01-13 devnull swt:
1956 3940506b 2005-01-13 devnull switch(c) {
1957 3940506b 2005-01-13 devnull case ';':
1958 3940506b 2005-01-13 devnull if(brac == 0) {
1959 3940506b 2005-01-13 devnull Bputrune(faction, c);
1960 3940506b 2005-01-13 devnull return;
1961 3940506b 2005-01-13 devnull }
1962 3940506b 2005-01-13 devnull goto lcopy;
1963 3940506b 2005-01-13 devnull
1964 3940506b 2005-01-13 devnull case '{':
1965 3940506b 2005-01-13 devnull brac++;
1966 3940506b 2005-01-13 devnull goto lcopy;
1967 3940506b 2005-01-13 devnull
1968 3940506b 2005-01-13 devnull case '$':
1969 3940506b 2005-01-13 devnull s = 1;
1970 3940506b 2005-01-13 devnull tok = -1;
1971 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1972 3940506b 2005-01-13 devnull
1973 3940506b 2005-01-13 devnull /* type description */
1974 3940506b 2005-01-13 devnull if(c == '<') {
1975 3940506b 2005-01-13 devnull Bungetrune(finput);
1976 3940506b 2005-01-13 devnull if(gettok() != TYPENAME)
1977 3940506b 2005-01-13 devnull error("bad syntax on $<ident> clause");
1978 3940506b 2005-01-13 devnull tok = numbval;
1979 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1980 3940506b 2005-01-13 devnull }
1981 3940506b 2005-01-13 devnull if(c == '$') {
1982 3940506b 2005-01-13 devnull Bprint(faction, "yyval");
1983 3940506b 2005-01-13 devnull
1984 3940506b 2005-01-13 devnull /* put out the proper tag... */
1985 3940506b 2005-01-13 devnull if(ntypes) {
1986 3940506b 2005-01-13 devnull if(tok < 0)
1987 3940506b 2005-01-13 devnull tok = fdtype(*prdptr[nprod]);
1988 3940506b 2005-01-13 devnull Bprint(faction, ".%s", typeset[tok]);
1989 3940506b 2005-01-13 devnull }
1990 3940506b 2005-01-13 devnull goto loop;
1991 3940506b 2005-01-13 devnull }
1992 3940506b 2005-01-13 devnull if(c == '-') {
1993 3940506b 2005-01-13 devnull s = -s;
1994 3940506b 2005-01-13 devnull c = Bgetrune(finput);
1995 3940506b 2005-01-13 devnull }
1996 3940506b 2005-01-13 devnull if(isdigit(c)) {
1997 3940506b 2005-01-13 devnull j = 0;
1998 3940506b 2005-01-13 devnull while(isdigit(c)) {
1999 3940506b 2005-01-13 devnull j = j*10 + (c-'0');
2000 3940506b 2005-01-13 devnull c = Bgetrune(finput);
2001 3940506b 2005-01-13 devnull }
2002 3940506b 2005-01-13 devnull Bungetrune(finput);
2003 3940506b 2005-01-13 devnull j = j*s - offset;
2004 3940506b 2005-01-13 devnull if(j > 0)
2005 3940506b 2005-01-13 devnull error("Illegal use of $%d", j+offset);
2006 3940506b 2005-01-13 devnull
2007 3940506b 2005-01-13 devnull dollar:
2008 3940506b 2005-01-13 devnull Bprint(faction, "yypt[-%d].yyv", -j);
2009 3940506b 2005-01-13 devnull
2010 3940506b 2005-01-13 devnull /* put out the proper tag */
2011 3940506b 2005-01-13 devnull if(ntypes) {
2012 3940506b 2005-01-13 devnull if(j+offset <= 0 && tok < 0)
2013 3940506b 2005-01-13 devnull error("must specify type of $%d", j+offset);
2014 3940506b 2005-01-13 devnull if(tok < 0)
2015 3940506b 2005-01-13 devnull tok = fdtype(prdptr[nprod][j+offset]);
2016 3940506b 2005-01-13 devnull Bprint(faction, ".%s", typeset[tok]);
2017 3940506b 2005-01-13 devnull }
2018 3940506b 2005-01-13 devnull goto loop;
2019 3940506b 2005-01-13 devnull }
2020 3940506b 2005-01-13 devnull if(isupper(c) || islower(c) || c == '_' || c == '.') {
2021 3940506b 2005-01-13 devnull int tok; /* tok used oustide for type info */
2022 3940506b 2005-01-13 devnull
2023 3940506b 2005-01-13 devnull /* look for $name */
2024 3940506b 2005-01-13 devnull Bungetrune(finput);
2025 3940506b 2005-01-13 devnull if(gettok() != IDENTIFIER)
2026 3940506b 2005-01-13 devnull error("$ must be followed by an identifier");
2027 3940506b 2005-01-13 devnull tok = chfind(2, tokname);
2028 3940506b 2005-01-13 devnull if((c = Bgetrune(finput)) != '#') {
2029 3940506b 2005-01-13 devnull Bungetrune(finput);
2030 3940506b 2005-01-13 devnull fnd = -1;
2031 3940506b 2005-01-13 devnull } else
2032 3940506b 2005-01-13 devnull if(gettok() != NUMBER) {
2033 3940506b 2005-01-13 devnull error("# must be followed by number");
2034 3940506b 2005-01-13 devnull fnd = -1;
2035 3940506b 2005-01-13 devnull } else
2036 3940506b 2005-01-13 devnull fnd = numbval;
2037 3940506b 2005-01-13 devnull for(j=1; j<=offset; ++j)
2038 3940506b 2005-01-13 devnull if(tok == prdptr[nprod][j]) {
2039 3940506b 2005-01-13 devnull if(--fnd <= 0) {
2040 3940506b 2005-01-13 devnull j -= offset;
2041 3940506b 2005-01-13 devnull goto dollar;
2042 3940506b 2005-01-13 devnull }
2043 3940506b 2005-01-13 devnull }
2044 3940506b 2005-01-13 devnull error("$name or $name#number not found");
2045 3940506b 2005-01-13 devnull }
2046 3940506b 2005-01-13 devnull Bputc(faction, '$');
2047 3940506b 2005-01-13 devnull if(s < 0 )
2048 3940506b 2005-01-13 devnull Bputc(faction, '-');
2049 3940506b 2005-01-13 devnull goto swt;
2050 3940506b 2005-01-13 devnull
2051 3940506b 2005-01-13 devnull case '}':
2052 3940506b 2005-01-13 devnull brac--;
2053 3940506b 2005-01-13 devnull if(brac)
2054 3940506b 2005-01-13 devnull goto lcopy;
2055 3940506b 2005-01-13 devnull Bputrune(faction, c);
2056 3940506b 2005-01-13 devnull return;
2057 3940506b 2005-01-13 devnull
2058 3940506b 2005-01-13 devnull case '/':
2059 3940506b 2005-01-13 devnull /* look for comments */
2060 3940506b 2005-01-13 devnull Bputrune(faction, c);
2061 3940506b 2005-01-13 devnull c = Bgetrune(finput);
2062 3940506b 2005-01-13 devnull if(c != '*')
2063 3940506b 2005-01-13 devnull goto swt;
2064 3940506b 2005-01-13 devnull
2065 3940506b 2005-01-13 devnull /* it really is a comment */
2066 3940506b 2005-01-13 devnull Bputrune(faction, c);
2067 3940506b 2005-01-13 devnull c = Bgetrune(finput);
2068 3940506b 2005-01-13 devnull while(c >= 0) {
2069 3940506b 2005-01-13 devnull while(c == '*') {
2070 3940506b 2005-01-13 devnull Bputrune(faction, c);
2071 3940506b 2005-01-13 devnull if((c=Bgetrune(finput)) == '/')
2072 3940506b 2005-01-13 devnull goto lcopy;
2073 3940506b 2005-01-13 devnull }
2074 3940506b 2005-01-13 devnull Bputrune(faction, c);
2075 3940506b 2005-01-13 devnull if(c == '\n')
2076 3940506b 2005-01-13 devnull lineno++;
2077 3940506b 2005-01-13 devnull c = Bgetrune(finput);
2078 3940506b 2005-01-13 devnull }
2079 3940506b 2005-01-13 devnull error("EOF inside comment");
2080 3940506b 2005-01-13 devnull
2081 3940506b 2005-01-13 devnull case '\'':
2082 3940506b 2005-01-13 devnull /* character constant */
2083 3940506b 2005-01-13 devnull match = '\'';
2084 3940506b 2005-01-13 devnull goto string;
2085 3940506b 2005-01-13 devnull
2086 3940506b 2005-01-13 devnull case '"':
2087 3940506b 2005-01-13 devnull /* character string */
2088 3940506b 2005-01-13 devnull match = '"';
2089 3940506b 2005-01-13 devnull
2090 3940506b 2005-01-13 devnull string:
2091 3940506b 2005-01-13 devnull Bputrune(faction, c);
2092 3940506b 2005-01-13 devnull while(c = Bgetrune(finput)) {
2093 3940506b 2005-01-13 devnull if(c == '\\') {
2094 3940506b 2005-01-13 devnull Bputrune(faction, c);
2095 3940506b 2005-01-13 devnull c = Bgetrune(finput);
2096 3940506b 2005-01-13 devnull if(c == '\n')
2097 3940506b 2005-01-13 devnull lineno++;
2098 3940506b 2005-01-13 devnull } else
2099 3940506b 2005-01-13 devnull if(c == match)
2100 3940506b 2005-01-13 devnull goto lcopy;
2101 3940506b 2005-01-13 devnull if(c == '\n')
2102 3940506b 2005-01-13 devnull error("newline in string or char. const.");
2103 3940506b 2005-01-13 devnull Bputrune(faction, c);
2104 3940506b 2005-01-13 devnull }
2105 3940506b 2005-01-13 devnull error("EOF in string or character constant");
2106 3940506b 2005-01-13 devnull
2107 3940506b 2005-01-13 devnull case Beof:
2108 3940506b 2005-01-13 devnull error("action does not terminate");
2109 3940506b 2005-01-13 devnull
2110 3940506b 2005-01-13 devnull case '\n':
2111 3940506b 2005-01-13 devnull lineno++;
2112 3940506b 2005-01-13 devnull goto lcopy;
2113 3940506b 2005-01-13 devnull }
2114 3940506b 2005-01-13 devnull
2115 3940506b 2005-01-13 devnull lcopy:
2116 3940506b 2005-01-13 devnull Bputrune(faction, c);
2117 3940506b 2005-01-13 devnull goto loop;
2118 3940506b 2005-01-13 devnull }
2119 3940506b 2005-01-13 devnull
2120 3940506b 2005-01-13 devnull void
2121 3940506b 2005-01-13 devnull openup(char *stem, int dflag, int vflag, int ytab, char *ytabc)
2122 3940506b 2005-01-13 devnull {
2123 3940506b 2005-01-13 devnull char buf[256];
2124 3940506b 2005-01-13 devnull
2125 3940506b 2005-01-13 devnull if(vflag) {
2126 3940506b 2005-01-13 devnull sprint(buf, "%s.%s", stem, FILEU);
2127 3940506b 2005-01-13 devnull foutput = Bopen(buf, OWRITE);
2128 3940506b 2005-01-13 devnull if(foutput == 0)
2129 3940506b 2005-01-13 devnull error("cannot open %s", buf);
2130 3940506b 2005-01-13 devnull }
2131 3940506b 2005-01-13 devnull if(yydebug) {
2132 3940506b 2005-01-13 devnull sprint(buf, "%s.%s", stem, FILEDEBUG);
2133 3940506b 2005-01-13 devnull if((fdebug = Bopen(buf, OWRITE)) == 0)
2134 3940506b 2005-01-13 devnull error("can't open %s", buf);
2135 3940506b 2005-01-13 devnull }
2136 3940506b 2005-01-13 devnull if(dflag) {
2137 3940506b 2005-01-13 devnull sprint(buf, "%s.%s", stem, FILED);
2138 3940506b 2005-01-13 devnull fdefine = Bopen(buf, OWRITE);
2139 3940506b 2005-01-13 devnull if(fdefine == 0)
2140 3940506b 2005-01-13 devnull error("can't create %s", buf);
2141 3940506b 2005-01-13 devnull }
2142 3940506b 2005-01-13 devnull if(ytab == 0)
2143 3940506b 2005-01-13 devnull sprint(buf, "%s.%s", stem, OFILE);
2144 3940506b 2005-01-13 devnull else
2145 3940506b 2005-01-13 devnull strcpy(buf, ytabc);
2146 3940506b 2005-01-13 devnull ftable = Bopen(buf, OWRITE);
2147 3940506b 2005-01-13 devnull if(ftable == 0)
2148 3940506b 2005-01-13 devnull error("cannot open table file %s", buf);
2149 3940506b 2005-01-13 devnull }
2150 3940506b 2005-01-13 devnull
2151 3940506b 2005-01-13 devnull /*
2152 3940506b 2005-01-13 devnull * print the output for the states
2153 3940506b 2005-01-13 devnull */
2154 3940506b 2005-01-13 devnull void
2155 3940506b 2005-01-13 devnull output(void)
2156 3940506b 2005-01-13 devnull {
2157 3940506b 2005-01-13 devnull int i, k, c;
2158 3940506b 2005-01-13 devnull Wset *u, *v;
2159 3940506b 2005-01-13 devnull
2160 3940506b 2005-01-13 devnull Bprint(ftable, "short yyexca[] =\n{");
2161 3940506b 2005-01-13 devnull if(fdebug)
2162 3940506b 2005-01-13 devnull Bprint(fdebug, "char* yystates[] =\n{\n");
2163 3940506b 2005-01-13 devnull
2164 3940506b 2005-01-13 devnull /* output the stuff for state i */
2165 3940506b 2005-01-13 devnull SLOOP(i) {
2166 3940506b 2005-01-13 devnull nolook = tystate[i]!=MUSTLOOKAHEAD;
2167 3940506b 2005-01-13 devnull closure(i);
2168 3940506b 2005-01-13 devnull
2169 3940506b 2005-01-13 devnull /* output actions */
2170 3940506b 2005-01-13 devnull nolook = 1;
2171 3940506b 2005-01-13 devnull aryfil(temp1, ntokens+nnonter+1, 0);
2172 3940506b 2005-01-13 devnull WSLOOP(wsets, u) {
2173 3940506b 2005-01-13 devnull c = *(u->pitem);
2174 3940506b 2005-01-13 devnull if(c > 1 && c < NTBASE && temp1[c] == 0) {
2175 3940506b 2005-01-13 devnull WSLOOP(u, v)
2176 3940506b 2005-01-13 devnull if(c == *(v->pitem))
2177 3940506b 2005-01-13 devnull putitem(v->pitem+1, (Lkset*)0);
2178 3940506b 2005-01-13 devnull temp1[c] = state(c);
2179 3940506b 2005-01-13 devnull } else
2180 3940506b 2005-01-13 devnull if(c > NTBASE && temp1[(c -= NTBASE) + ntokens] == 0)
2181 3940506b 2005-01-13 devnull temp1[c+ntokens] = amem[indgo[i]+c];
2182 3940506b 2005-01-13 devnull }
2183 3940506b 2005-01-13 devnull if(i == 1)
2184 3940506b 2005-01-13 devnull temp1[1] = ACCEPTCODE;
2185 3940506b 2005-01-13 devnull
2186 3940506b 2005-01-13 devnull /* now, we have the shifts; look at the reductions */
2187 3940506b 2005-01-13 devnull lastred = 0;
2188 3940506b 2005-01-13 devnull WSLOOP(wsets, u) {
2189 3940506b 2005-01-13 devnull c = *u->pitem;
2190 3940506b 2005-01-13 devnull
2191 3940506b 2005-01-13 devnull /* reduction */
2192 3940506b 2005-01-13 devnull if(c <= 0) {
2193 3940506b 2005-01-13 devnull lastred = -c;
2194 3940506b 2005-01-13 devnull TLOOP(k)
2195 3940506b 2005-01-13 devnull if(BIT(u->ws.lset, k)) {
2196 3940506b 2005-01-13 devnull if(temp1[k] == 0)
2197 3940506b 2005-01-13 devnull temp1[k] = c;
2198 3940506b 2005-01-13 devnull else
2199 3940506b 2005-01-13 devnull if(temp1[k] < 0) { /* reduce/reduce conflict */
2200 3940506b 2005-01-13 devnull if(foutput)
2201 3940506b 2005-01-13 devnull Bprint(foutput,
2202 3940506b 2005-01-13 devnull "\n%d: reduce/reduce conflict"
2203 3940506b 2005-01-13 devnull " (red'ns %d and %d ) on %s",
2204 3940506b 2005-01-13 devnull i, -temp1[k], lastred,
2205 3940506b 2005-01-13 devnull symnam(k));
2206 3940506b 2005-01-13 devnull if(-temp1[k] > lastred)
2207 3940506b 2005-01-13 devnull temp1[k] = -lastred;
2208 3940506b 2005-01-13 devnull zzrrconf++;
2209 3940506b 2005-01-13 devnull } else
2210 3940506b 2005-01-13 devnull /* potential shift/reduce conflict */
2211 3940506b 2005-01-13 devnull precftn( lastred, k, i );
2212 3940506b 2005-01-13 devnull }
2213 3940506b 2005-01-13 devnull }
2214 3940506b 2005-01-13 devnull }
2215 3940506b 2005-01-13 devnull wract(i);
2216 3940506b 2005-01-13 devnull }
2217 3940506b 2005-01-13 devnull
2218 3940506b 2005-01-13 devnull if(fdebug)
2219 3940506b 2005-01-13 devnull Bprint(fdebug, "};\n");
2220 3940506b 2005-01-13 devnull Bprint(ftable, "};\n");
2221 3940506b 2005-01-13 devnull Bprint(ftable, "#define YYNPROD %d\n", nprod);
2222 3940506b 2005-01-13 devnull Bprint(ftable, "#define YYPRIVATE %d\n", PRIVATE);
2223 3940506b 2005-01-13 devnull if(yydebug)
2224 3940506b 2005-01-13 devnull Bprint(ftable, "#define yydebug %s\n", yydebug);
2225 3940506b 2005-01-13 devnull }
2226 3940506b 2005-01-13 devnull
2227 3940506b 2005-01-13 devnull /*
2228 3940506b 2005-01-13 devnull * pack state i from temp1 into amem
2229 3940506b 2005-01-13 devnull */
2230 3940506b 2005-01-13 devnull int
2231 3940506b 2005-01-13 devnull apack(int *p, int n)
2232 3940506b 2005-01-13 devnull {
2233 3940506b 2005-01-13 devnull int *pp, *qq, *rr, off, *q, *r;
2234 3940506b 2005-01-13 devnull
2235 3940506b 2005-01-13 devnull /* we don't need to worry about checking because
2236 3940506b 2005-01-13 devnull * we will only look at entries known to be there...
2237 3940506b 2005-01-13 devnull * eliminate leading and trailing 0's
2238 3940506b 2005-01-13 devnull */
2239 3940506b 2005-01-13 devnull
2240 3940506b 2005-01-13 devnull q = p+n;
2241 3940506b 2005-01-13 devnull for(pp = p, off = 0; *pp == 0 && pp <= q; ++pp, --off)
2242 3940506b 2005-01-13 devnull ;
2243 3940506b 2005-01-13 devnull /* no actions */
2244 3940506b 2005-01-13 devnull if(pp > q)
2245 3940506b 2005-01-13 devnull return 0;
2246 3940506b 2005-01-13 devnull p = pp;
2247 3940506b 2005-01-13 devnull
2248 3940506b 2005-01-13 devnull /* now, find a place for the elements from p to q, inclusive */
2249 3940506b 2005-01-13 devnull r = &amem[ACTSIZE-1];
2250 3940506b 2005-01-13 devnull for(rr = amem; rr <= r; rr++, off++) {
2251 3940506b 2005-01-13 devnull for(qq = rr, pp = p; pp <= q; pp++, qq++)
2252 3940506b 2005-01-13 devnull if(*pp != 0)
2253 3940506b 2005-01-13 devnull if(*pp != *qq && *qq != 0)
2254 3940506b 2005-01-13 devnull goto nextk;
2255 3940506b 2005-01-13 devnull
2256 3940506b 2005-01-13 devnull /* we have found an acceptable k */
2257 3940506b 2005-01-13 devnull if(pkdebug && foutput != 0)
2258 3940506b 2005-01-13 devnull Bprint(foutput, "off = %d, k = %d\n", off, (int)(rr-amem));
2259 3940506b 2005-01-13 devnull for(qq = rr, pp = p; pp <= q; pp++, qq++)
2260 3940506b 2005-01-13 devnull if(*pp) {
2261 3940506b 2005-01-13 devnull if(qq > r)
2262 3940506b 2005-01-13 devnull error("action table overflow");
2263 3940506b 2005-01-13 devnull if(qq > memp)
2264 3940506b 2005-01-13 devnull memp = qq;
2265 3940506b 2005-01-13 devnull *qq = *pp;
2266 3940506b 2005-01-13 devnull }
2267 3940506b 2005-01-13 devnull if(pkdebug && foutput != 0)
2268 3940506b 2005-01-13 devnull for(pp = amem; pp <= memp; pp += 10) {
2269 3940506b 2005-01-13 devnull Bprint(foutput, "\t");
2270 3940506b 2005-01-13 devnull for(qq = pp; qq <= pp+9; qq++)
2271 3940506b 2005-01-13 devnull Bprint(foutput, "%d ", *qq);
2272 3940506b 2005-01-13 devnull Bprint(foutput, "\n");
2273 3940506b 2005-01-13 devnull }
2274 3940506b 2005-01-13 devnull return(off);
2275 3940506b 2005-01-13 devnull nextk:;
2276 3940506b 2005-01-13 devnull }
2277 3940506b 2005-01-13 devnull error("no space in action table");
2278 3940506b 2005-01-13 devnull return 0;
2279 3940506b 2005-01-13 devnull }
2280 3940506b 2005-01-13 devnull
2281 3940506b 2005-01-13 devnull /*
2282 3940506b 2005-01-13 devnull * output the gotos for the nontermninals
2283 3940506b 2005-01-13 devnull */
2284 3940506b 2005-01-13 devnull void
2285 3940506b 2005-01-13 devnull go2out(void)
2286 3940506b 2005-01-13 devnull {
2287 3940506b 2005-01-13 devnull int i, j, k, best, count, cbest, times;
2288 3940506b 2005-01-13 devnull
2289 3940506b 2005-01-13 devnull /* mark begining of gotos */
2290 3940506b 2005-01-13 devnull Bprint(ftemp, "$\n");
2291 3940506b 2005-01-13 devnull for(i = 1; i <= nnonter; i++) {
2292 3940506b 2005-01-13 devnull go2gen(i);
2293 3940506b 2005-01-13 devnull
2294 3940506b 2005-01-13 devnull /* find the best one to make default */
2295 3940506b 2005-01-13 devnull best = -1;
2296 3940506b 2005-01-13 devnull times = 0;
2297 3940506b 2005-01-13 devnull
2298 3940506b 2005-01-13 devnull /* is j the most frequent */
2299 3940506b 2005-01-13 devnull for(j = 0; j <= nstate; j++) {
2300 3940506b 2005-01-13 devnull if(tystate[j] == 0)
2301 3940506b 2005-01-13 devnull continue;
2302 3940506b 2005-01-13 devnull if(tystate[j] == best)
2303 3940506b 2005-01-13 devnull continue;
2304 3940506b 2005-01-13 devnull
2305 3940506b 2005-01-13 devnull /* is tystate[j] the most frequent */
2306 3940506b 2005-01-13 devnull count = 0;
2307 3940506b 2005-01-13 devnull cbest = tystate[j];
2308 3940506b 2005-01-13 devnull for(k = j; k <= nstate; k++)
2309 3940506b 2005-01-13 devnull if(tystate[k] == cbest)
2310 3940506b 2005-01-13 devnull count++;
2311 3940506b 2005-01-13 devnull if(count > times) {
2312 3940506b 2005-01-13 devnull best = cbest;
2313 3940506b 2005-01-13 devnull times = count;
2314 3940506b 2005-01-13 devnull }
2315 3940506b 2005-01-13 devnull }
2316 3940506b 2005-01-13 devnull
2317 3940506b 2005-01-13 devnull /* best is now the default entry */
2318 3940506b 2005-01-13 devnull zzgobest += times-1;
2319 3940506b 2005-01-13 devnull for(j = 0; j <= nstate; j++)
2320 3940506b 2005-01-13 devnull if(tystate[j] != 0 && tystate[j] != best) {
2321 3940506b 2005-01-13 devnull Bprint(ftemp, "%d,%d,", j, tystate[j]);
2322 3940506b 2005-01-13 devnull zzgoent++;
2323 3940506b 2005-01-13 devnull }
2324 3940506b 2005-01-13 devnull
2325 3940506b 2005-01-13 devnull /* now, the default */
2326 3940506b 2005-01-13 devnull if(best == -1)
2327 3940506b 2005-01-13 devnull best = 0;
2328 3940506b 2005-01-13 devnull zzgoent++;
2329 3940506b 2005-01-13 devnull Bprint(ftemp, "%d\n", best);
2330 3940506b 2005-01-13 devnull }
2331 3940506b 2005-01-13 devnull }
2332 3940506b 2005-01-13 devnull
2333 3940506b 2005-01-13 devnull /*
2334 3940506b 2005-01-13 devnull * output the gotos for nonterminal c
2335 3940506b 2005-01-13 devnull */
2336 3940506b 2005-01-13 devnull void
2337 3940506b 2005-01-13 devnull go2gen(int c)
2338 3940506b 2005-01-13 devnull {
2339 3940506b 2005-01-13 devnull int i, work, cc;
2340 3940506b 2005-01-13 devnull Item *p, *q;
2341 3940506b 2005-01-13 devnull
2342 3940506b 2005-01-13 devnull
2343 3940506b 2005-01-13 devnull /* first, find nonterminals with gotos on c */
2344 3940506b 2005-01-13 devnull aryfil(temp1, nnonter+1, 0);
2345 3940506b 2005-01-13 devnull temp1[c] = 1;
2346 3940506b 2005-01-13 devnull work = 1;
2347 3940506b 2005-01-13 devnull while(work) {
2348 3940506b 2005-01-13 devnull work = 0;
2349 3940506b 2005-01-13 devnull PLOOP(0, i)
2350 3940506b 2005-01-13 devnull
2351 3940506b 2005-01-13 devnull /* cc is a nonterminal */
2352 3940506b 2005-01-13 devnull if((cc=prdptr[i][1]-NTBASE) >= 0)
2353 3940506b 2005-01-13 devnull /* cc has a goto on c */
2354 3940506b 2005-01-13 devnull if(temp1[cc] != 0) {
2355 3940506b 2005-01-13 devnull
2356 3940506b 2005-01-13 devnull /* thus, the left side of production i does too */
2357 3940506b 2005-01-13 devnull cc = *prdptr[i]-NTBASE;
2358 3940506b 2005-01-13 devnull if(temp1[cc] == 0) {
2359 3940506b 2005-01-13 devnull work = 1;
2360 3940506b 2005-01-13 devnull temp1[cc] = 1;
2361 3940506b 2005-01-13 devnull }
2362 3940506b 2005-01-13 devnull }
2363 3940506b 2005-01-13 devnull }
2364 3940506b 2005-01-13 devnull
2365 3940506b 2005-01-13 devnull /* now, we have temp1[c] = 1 if a goto on c in closure of cc */
2366 3940506b 2005-01-13 devnull if(g2debug && foutput != 0) {
2367 3940506b 2005-01-13 devnull Bprint(foutput, "%s: gotos on ", nontrst[c].name);
2368 3940506b 2005-01-13 devnull NTLOOP(i)
2369 3940506b 2005-01-13 devnull if(temp1[i])
2370 3940506b 2005-01-13 devnull Bprint(foutput, "%s ", nontrst[i].name);
2371 3940506b 2005-01-13 devnull Bprint(foutput, "\n");
2372 3940506b 2005-01-13 devnull }
2373 3940506b 2005-01-13 devnull
2374 3940506b 2005-01-13 devnull /* now, go through and put gotos into tystate */
2375 3940506b 2005-01-13 devnull aryfil(tystate, nstate, 0);
2376 3940506b 2005-01-13 devnull SLOOP(i)
2377 3940506b 2005-01-13 devnull ITMLOOP(i, p, q)
2378 3940506b 2005-01-13 devnull if((cc = *p->pitem) >= NTBASE)
2379 3940506b 2005-01-13 devnull /* goto on c is possible */
2380 3940506b 2005-01-13 devnull if(temp1[cc-NTBASE]) {
2381 3940506b 2005-01-13 devnull tystate[i] = amem[indgo[i]+c];
2382 3940506b 2005-01-13 devnull break;
2383 3940506b 2005-01-13 devnull }
2384 3940506b 2005-01-13 devnull }
2385 3940506b 2005-01-13 devnull
2386 3940506b 2005-01-13 devnull /*
2387 3940506b 2005-01-13 devnull * decide a shift/reduce conflict by precedence.
2388 3940506b 2005-01-13 devnull * r is a rule number, t a token number
2389 3940506b 2005-01-13 devnull * the conflict is in state s
2390 3940506b 2005-01-13 devnull * temp1[t] is changed to reflect the action
2391 3940506b 2005-01-13 devnull */
2392 3940506b 2005-01-13 devnull void
2393 3940506b 2005-01-13 devnull precftn(int r, int t, int s)
2394 3940506b 2005-01-13 devnull {
2395 3940506b 2005-01-13 devnull int lp, lt, action;
2396 3940506b 2005-01-13 devnull
2397 3940506b 2005-01-13 devnull lp = levprd[r];
2398 3940506b 2005-01-13 devnull lt = toklev[t];
2399 3940506b 2005-01-13 devnull if(PLEVEL(lt) == 0 || PLEVEL(lp) == 0) {
2400 3940506b 2005-01-13 devnull
2401 3940506b 2005-01-13 devnull /* conflict */
2402 3940506b 2005-01-13 devnull if(foutput != 0)
2403 3940506b 2005-01-13 devnull Bprint(foutput,
2404 3940506b 2005-01-13 devnull "\n%d: shift/reduce conflict (shift %d(%d), red'n %d(%d)) on %s",
2405 3940506b 2005-01-13 devnull s, temp1[t], PLEVEL(lt), r, PLEVEL(lp), symnam(t));
2406 3940506b 2005-01-13 devnull zzsrconf++;
2407 3940506b 2005-01-13 devnull return;
2408 3940506b 2005-01-13 devnull }
2409 3940506b 2005-01-13 devnull if(PLEVEL(lt) == PLEVEL(lp))
2410 3940506b 2005-01-13 devnull action = ASSOC(lt);
2411 3940506b 2005-01-13 devnull else
2412 3940506b 2005-01-13 devnull if(PLEVEL(lt) > PLEVEL(lp))
2413 3940506b 2005-01-13 devnull action = RASC; /* shift */
2414 3940506b 2005-01-13 devnull else
2415 3940506b 2005-01-13 devnull action = LASC; /* reduce */
2416 3940506b 2005-01-13 devnull switch(action) {
2417 3940506b 2005-01-13 devnull case BASC: /* error action */
2418 3940506b 2005-01-13 devnull temp1[t] = ERRCODE;
2419 3940506b 2005-01-13 devnull break;
2420 3940506b 2005-01-13 devnull case LASC: /* reduce */
2421 3940506b 2005-01-13 devnull temp1[t] = -r;
2422 3940506b 2005-01-13 devnull break;
2423 3940506b 2005-01-13 devnull }
2424 3940506b 2005-01-13 devnull }
2425 3940506b 2005-01-13 devnull
2426 3940506b 2005-01-13 devnull /*
2427 3940506b 2005-01-13 devnull * output state i
2428 3940506b 2005-01-13 devnull * temp1 has the actions, lastred the default
2429 3940506b 2005-01-13 devnull */
2430 3940506b 2005-01-13 devnull void
2431 3940506b 2005-01-13 devnull wract(int i)
2432 3940506b 2005-01-13 devnull {
2433 3940506b 2005-01-13 devnull int p, p0, p1, ntimes, tred, count, j, flag;
2434 3940506b 2005-01-13 devnull
2435 3940506b 2005-01-13 devnull /* find the best choice for lastred */
2436 3940506b 2005-01-13 devnull lastred = 0;
2437 3940506b 2005-01-13 devnull ntimes = 0;
2438 3940506b 2005-01-13 devnull TLOOP(j) {
2439 3940506b 2005-01-13 devnull if(temp1[j] >= 0)
2440 3940506b 2005-01-13 devnull continue;
2441 3940506b 2005-01-13 devnull if(temp1[j]+lastred == 0)
2442 3940506b 2005-01-13 devnull continue;
2443 3940506b 2005-01-13 devnull /* count the number of appearances of temp1[j] */
2444 3940506b 2005-01-13 devnull count = 0;
2445 3940506b 2005-01-13 devnull tred = -temp1[j];
2446 3940506b 2005-01-13 devnull levprd[tred] |= REDFLAG;
2447 3940506b 2005-01-13 devnull TLOOP(p)
2448 3940506b 2005-01-13 devnull if(temp1[p]+tred == 0)
2449 3940506b 2005-01-13 devnull count++;
2450 3940506b 2005-01-13 devnull if(count > ntimes) {
2451 3940506b 2005-01-13 devnull lastred = tred;
2452 3940506b 2005-01-13 devnull ntimes = count;
2453 3940506b 2005-01-13 devnull }
2454 3940506b 2005-01-13 devnull }
2455 3940506b 2005-01-13 devnull
2456 3940506b 2005-01-13 devnull /*
2457 3940506b 2005-01-13 devnull * for error recovery, arrange that, if there is a shift on the
2458 3940506b 2005-01-13 devnull * error recovery token, `error', that the default be the error action
2459 3940506b 2005-01-13 devnull */
2460 3940506b 2005-01-13 devnull if(temp1[2] > 0)
2461 3940506b 2005-01-13 devnull lastred = 0;
2462 3940506b 2005-01-13 devnull
2463 3940506b 2005-01-13 devnull /* clear out entries in temp1 which equal lastred */
2464 3940506b 2005-01-13 devnull TLOOP(p)
2465 3940506b 2005-01-13 devnull if(temp1[p]+lastred == 0)
2466 3940506b 2005-01-13 devnull temp1[p] = 0;
2467 3940506b 2005-01-13 devnull
2468 3940506b 2005-01-13 devnull wrstate(i);
2469 3940506b 2005-01-13 devnull defact[i] = lastred;
2470 3940506b 2005-01-13 devnull flag = 0;
2471 3940506b 2005-01-13 devnull TLOOP(p0)
2472 3940506b 2005-01-13 devnull if((p1=temp1[p0]) != 0) {
2473 3940506b 2005-01-13 devnull if(p1 < 0) {
2474 3940506b 2005-01-13 devnull p1 = -p1;
2475 3940506b 2005-01-13 devnull goto exc;
2476 3940506b 2005-01-13 devnull }
2477 3940506b 2005-01-13 devnull if(p1 == ACCEPTCODE) {
2478 3940506b 2005-01-13 devnull p1 = -1;
2479 3940506b 2005-01-13 devnull goto exc;
2480 3940506b 2005-01-13 devnull }
2481 3940506b 2005-01-13 devnull if(p1 == ERRCODE) {
2482 3940506b 2005-01-13 devnull p1 = 0;
2483 3940506b 2005-01-13 devnull exc:
2484 3940506b 2005-01-13 devnull if(flag++ == 0)
2485 3940506b 2005-01-13 devnull Bprint(ftable, "-1, %d,\n", i);
2486 3940506b 2005-01-13 devnull Bprint(ftable, "\t%d, %d,\n", p0, p1);
2487 3940506b 2005-01-13 devnull zzexcp++;
2488 3940506b 2005-01-13 devnull continue;
2489 3940506b 2005-01-13 devnull }
2490 3940506b 2005-01-13 devnull Bprint(ftemp, "%d,%d,", p0, p1);
2491 3940506b 2005-01-13 devnull zzacent++;
2492 3940506b 2005-01-13 devnull }
2493 3940506b 2005-01-13 devnull if(flag) {
2494 3940506b 2005-01-13 devnull defact[i] = -2;
2495 3940506b 2005-01-13 devnull Bprint(ftable, "\t-2, %d,\n", lastred);
2496 3940506b 2005-01-13 devnull }
2497 3940506b 2005-01-13 devnull Bprint(ftemp, "\n");
2498 3940506b 2005-01-13 devnull }
2499 3940506b 2005-01-13 devnull
2500 3940506b 2005-01-13 devnull /*
2501 3940506b 2005-01-13 devnull * writes state i
2502 3940506b 2005-01-13 devnull */
2503 3940506b 2005-01-13 devnull void
2504 3940506b 2005-01-13 devnull wrstate(int i)
2505 3940506b 2005-01-13 devnull {
2506 3940506b 2005-01-13 devnull int j0, j1;
2507 3940506b 2005-01-13 devnull Item *pp, *qq;
2508 3940506b 2005-01-13 devnull Wset *u;
2509 3940506b 2005-01-13 devnull
2510 3940506b 2005-01-13 devnull if(fdebug) {
2511 3940506b 2005-01-13 devnull if(lastred) {
2512 3940506b 2005-01-13 devnull Bprint(fdebug, " 0, /*%d*/\n", i);
2513 3940506b 2005-01-13 devnull } else {
2514 3940506b 2005-01-13 devnull Bprint(fdebug, " \"");
2515 3940506b 2005-01-13 devnull ITMLOOP(i, pp, qq)
2516 3940506b 2005-01-13 devnull Bprint(fdebug, "%s\\n", writem(pp->pitem));
2517 3940506b 2005-01-13 devnull if(tystate[i] == MUSTLOOKAHEAD)
2518 3940506b 2005-01-13 devnull WSLOOP(wsets + (pstate[i+1] - pstate[i]), u)
2519 3940506b 2005-01-13 devnull if(*u->pitem < 0)
2520 3940506b 2005-01-13 devnull Bprint(fdebug, "%s\\n", writem(u->pitem));
2521 3940506b 2005-01-13 devnull Bprint(fdebug, "\", /*%d*/\n", i);
2522 3940506b 2005-01-13 devnull }
2523 3940506b 2005-01-13 devnull }
2524 3940506b 2005-01-13 devnull if(foutput == 0)
2525 3940506b 2005-01-13 devnull return;
2526 3940506b 2005-01-13 devnull Bprint(foutput, "\nstate %d\n", i);
2527 3940506b 2005-01-13 devnull ITMLOOP(i, pp, qq)
2528 3940506b 2005-01-13 devnull Bprint(foutput, "\t%s\n", writem(pp->pitem));
2529 3940506b 2005-01-13 devnull if(tystate[i] == MUSTLOOKAHEAD)
2530 3940506b 2005-01-13 devnull /* print out empty productions in closure */
2531 3940506b 2005-01-13 devnull WSLOOP(wsets+(pstate[i+1]-pstate[i]), u)
2532 3940506b 2005-01-13 devnull if(*u->pitem < 0)
2533 3940506b 2005-01-13 devnull Bprint(foutput, "\t%s\n", writem(u->pitem));
2534 3940506b 2005-01-13 devnull
2535 3940506b 2005-01-13 devnull /* check for state equal to another */
2536 3940506b 2005-01-13 devnull TLOOP(j0)
2537 3940506b 2005-01-13 devnull if((j1=temp1[j0]) != 0) {
2538 3940506b 2005-01-13 devnull Bprint(foutput, "\n\t%s ", symnam(j0));
2539 3940506b 2005-01-13 devnull /* shift, error, or accept */
2540 3940506b 2005-01-13 devnull if(j1 > 0) {
2541 3940506b 2005-01-13 devnull if(j1 == ACCEPTCODE)
2542 3940506b 2005-01-13 devnull Bprint(foutput, "accept");
2543 3940506b 2005-01-13 devnull else
2544 3940506b 2005-01-13 devnull if(j1 == ERRCODE)
2545 3940506b 2005-01-13 devnull Bprint(foutput, "error");
2546 3940506b 2005-01-13 devnull else
2547 3940506b 2005-01-13 devnull Bprint(foutput, "shift %d", j1);
2548 3940506b 2005-01-13 devnull } else
2549 3940506b 2005-01-13 devnull Bprint(foutput, "reduce %d (src line %d)", -j1, rlines[-j1]);
2550 3940506b 2005-01-13 devnull }
2551 3940506b 2005-01-13 devnull
2552 3940506b 2005-01-13 devnull /* output the final production */
2553 3940506b 2005-01-13 devnull if(lastred)
2554 3940506b 2005-01-13 devnull Bprint(foutput, "\n\t. reduce %d (src line %d)\n\n",
2555 3940506b 2005-01-13 devnull lastred, rlines[lastred]);
2556 3940506b 2005-01-13 devnull else
2557 3940506b 2005-01-13 devnull Bprint(foutput, "\n\t. error\n\n");
2558 3940506b 2005-01-13 devnull
2559 3940506b 2005-01-13 devnull /* now, output nonterminal actions */
2560 3940506b 2005-01-13 devnull j1 = ntokens;
2561 3940506b 2005-01-13 devnull for(j0 = 1; j0 <= nnonter; j0++) {
2562 3940506b 2005-01-13 devnull j1++;
2563 3940506b 2005-01-13 devnull if(temp1[j1])
2564 3940506b 2005-01-13 devnull Bprint(foutput, "\t%s goto %d\n", symnam(j0+NTBASE), temp1[j1]);
2565 3940506b 2005-01-13 devnull }
2566 3940506b 2005-01-13 devnull }
2567 3940506b 2005-01-13 devnull
2568 3940506b 2005-01-13 devnull void
2569 3940506b 2005-01-13 devnull warray(char *s, int *v, int n)
2570 3940506b 2005-01-13 devnull {
2571 3940506b 2005-01-13 devnull int i;
2572 3940506b 2005-01-13 devnull
2573 3940506b 2005-01-13 devnull Bprint(ftable, "short %s[] =\n{", s);
2574 3940506b 2005-01-13 devnull for(i=0;;) {
2575 3940506b 2005-01-13 devnull if(i%10 == 0)
2576 3940506b 2005-01-13 devnull Bprint(ftable, "\n");
2577 3940506b 2005-01-13 devnull Bprint(ftable, "%4d", v[i]);
2578 3940506b 2005-01-13 devnull i++;
2579 3940506b 2005-01-13 devnull if(i >= n) {
2580 3940506b 2005-01-13 devnull Bprint(ftable, "\n};\n");
2581 3940506b 2005-01-13 devnull break;
2582 3940506b 2005-01-13 devnull }
2583 3940506b 2005-01-13 devnull Bprint(ftable, ",");
2584 3940506b 2005-01-13 devnull }
2585 3940506b 2005-01-13 devnull }
2586 3940506b 2005-01-13 devnull
2587 3940506b 2005-01-13 devnull /*
2588 3940506b 2005-01-13 devnull * in order to free up the mem and amem arrays for the optimizer,
2589 3940506b 2005-01-13 devnull * and still be able to output yyr1, etc., after the sizes of
2590 3940506b 2005-01-13 devnull * the action array is known, we hide the nonterminals
2591 3940506b 2005-01-13 devnull * derived by productions in levprd.
2592 3940506b 2005-01-13 devnull */
2593 3940506b 2005-01-13 devnull
2594 3940506b 2005-01-13 devnull void
2595 3940506b 2005-01-13 devnull hideprod(void)
2596 3940506b 2005-01-13 devnull {
2597 3940506b 2005-01-13 devnull int i, j;
2598 3940506b 2005-01-13 devnull
2599 3940506b 2005-01-13 devnull j = 0;
2600 3940506b 2005-01-13 devnull levprd[0] = 0;
2601 3940506b 2005-01-13 devnull PLOOP(1, i) {
2602 3940506b 2005-01-13 devnull if(!(levprd[i] & REDFLAG)) {
2603 3940506b 2005-01-13 devnull j++;
2604 3940506b 2005-01-13 devnull if(foutput != 0)
2605 3940506b 2005-01-13 devnull Bprint(foutput, "Rule not reduced: %s\n", writem(prdptr[i]));
2606 3940506b 2005-01-13 devnull }
2607 3940506b 2005-01-13 devnull levprd[i] = *prdptr[i] - NTBASE;
2608 3940506b 2005-01-13 devnull }
2609 3940506b 2005-01-13 devnull if(j)
2610 3940506b 2005-01-13 devnull print("%d rules never reduced\n", j);
2611 3940506b 2005-01-13 devnull }
2612 3940506b 2005-01-13 devnull
2613 3940506b 2005-01-13 devnull void
2614 3940506b 2005-01-13 devnull callopt(void)
2615 3940506b 2005-01-13 devnull {
2616 3940506b 2005-01-13 devnull int i, *p, j, k, *q;
2617 3940506b 2005-01-13 devnull
2618 3940506b 2005-01-13 devnull /* read the arrays from tempfile and set parameters */
2619 3940506b 2005-01-13 devnull finput = Bopen(tempname, OREAD);
2620 3940506b 2005-01-13 devnull if(finput == 0)
2621 3940506b 2005-01-13 devnull error("optimizer cannot open tempfile");
2622 3940506b 2005-01-13 devnull
2623 3940506b 2005-01-13 devnull pgo[0] = 0;
2624 3940506b 2005-01-13 devnull temp1[0] = 0;
2625 3940506b 2005-01-13 devnull nstate = 0;
2626 3940506b 2005-01-13 devnull nnonter = 0;
2627 3940506b 2005-01-13 devnull for(;;) {
2628 3940506b 2005-01-13 devnull switch(gtnm()) {
2629 3940506b 2005-01-13 devnull case '\n':
2630 3940506b 2005-01-13 devnull nstate++;
2631 3940506b 2005-01-13 devnull pmem--;
2632 3940506b 2005-01-13 devnull temp1[nstate] = pmem - mem0;
2633 3940506b 2005-01-13 devnull case ',':
2634 3940506b 2005-01-13 devnull continue;
2635 3940506b 2005-01-13 devnull case '$':
2636 3940506b 2005-01-13 devnull break;
2637 3940506b 2005-01-13 devnull default:
2638 3940506b 2005-01-13 devnull error("bad tempfile %s", tempname);
2639 3940506b 2005-01-13 devnull }
2640 3940506b 2005-01-13 devnull break;
2641 3940506b 2005-01-13 devnull }
2642 3940506b 2005-01-13 devnull
2643 3940506b 2005-01-13 devnull pmem--;
2644 3940506b 2005-01-13 devnull temp1[nstate] = yypgo[0] = pmem - mem0;
2645 3940506b 2005-01-13 devnull for(;;) {
2646 3940506b 2005-01-13 devnull switch(gtnm()) {
2647 3940506b 2005-01-13 devnull case '\n':
2648 3940506b 2005-01-13 devnull nnonter++;
2649 3940506b 2005-01-13 devnull yypgo[nnonter] = pmem-mem0;
2650 3940506b 2005-01-13 devnull case ',':
2651 3940506b 2005-01-13 devnull continue;
2652 3940506b 2005-01-13 devnull case -1:
2653 3940506b 2005-01-13 devnull break;
2654 3940506b 2005-01-13 devnull default:
2655 3940506b 2005-01-13 devnull error("bad tempfile");
2656 3940506b 2005-01-13 devnull }
2657 3940506b 2005-01-13 devnull break;
2658 3940506b 2005-01-13 devnull }
2659 3940506b 2005-01-13 devnull pmem--;
2660 3940506b 2005-01-13 devnull yypgo[nnonter--] = pmem - mem0;
2661 3940506b 2005-01-13 devnull for(i = 0; i < nstate; i++) {
2662 3940506b 2005-01-13 devnull k = 32000;
2663 3940506b 2005-01-13 devnull j = 0;
2664 3940506b 2005-01-13 devnull q = mem0 + temp1[i+1];
2665 3940506b 2005-01-13 devnull for(p = mem0 + temp1[i]; p < q ; p += 2) {
2666 3940506b 2005-01-13 devnull if(*p > j)
2667 3940506b 2005-01-13 devnull j = *p;
2668 3940506b 2005-01-13 devnull if(*p < k)
2669 3940506b 2005-01-13 devnull k = *p;
2670 3940506b 2005-01-13 devnull }
2671 3940506b 2005-01-13 devnull /* nontrivial situation */
2672 3940506b 2005-01-13 devnull if(k <= j) {
2673 3940506b 2005-01-13 devnull /* j is now the range */
2674 3940506b 2005-01-13 devnull /* j -= k; *//* call scj */
2675 3940506b 2005-01-13 devnull if(k > maxoff)
2676 3940506b 2005-01-13 devnull maxoff = k;
2677 3940506b 2005-01-13 devnull }
2678 3940506b 2005-01-13 devnull tystate[i] = (temp1[i+1]-temp1[i]) + 2*j;
2679 3940506b 2005-01-13 devnull if(j > maxspr)
2680 3940506b 2005-01-13 devnull maxspr = j;
2681 3940506b 2005-01-13 devnull }
2682 3940506b 2005-01-13 devnull
2683 3940506b 2005-01-13 devnull /* initialize ggreed table */
2684 3940506b 2005-01-13 devnull for(i = 1; i <= nnonter; i++) {
2685 3940506b 2005-01-13 devnull ggreed[i] = 1;
2686 3940506b 2005-01-13 devnull j = 0;
2687 3940506b 2005-01-13 devnull
2688 3940506b 2005-01-13 devnull /* minimum entry index is always 0 */
2689 3940506b 2005-01-13 devnull q = mem0 + yypgo[i+1] - 1;
2690 3940506b 2005-01-13 devnull for(p = mem0+yypgo[i]; p < q ; p += 2) {
2691 3940506b 2005-01-13 devnull ggreed[i] += 2;
2692 3940506b 2005-01-13 devnull if(*p > j)
2693 3940506b 2005-01-13 devnull j = *p;
2694 3940506b 2005-01-13 devnull }
2695 3940506b 2005-01-13 devnull ggreed[i] = ggreed[i] + 2*j;
2696 3940506b 2005-01-13 devnull if(j > maxoff)
2697 3940506b 2005-01-13 devnull maxoff = j;
2698 3940506b 2005-01-13 devnull }
2699 3940506b 2005-01-13 devnull
2700 3940506b 2005-01-13 devnull /* now, prepare to put the shift actions into the amem array */
2701 3940506b 2005-01-13 devnull for(i = 0; i < ACTSIZE; i++)
2702 3940506b 2005-01-13 devnull amem[i] = 0;
2703 3940506b 2005-01-13 devnull maxa = amem;
2704 3940506b 2005-01-13 devnull for(i = 0; i < nstate; i++) {
2705 3940506b 2005-01-13 devnull if(tystate[i] == 0 && adb > 1)
2706 3940506b 2005-01-13 devnull Bprint(ftable, "State %d: null\n", i);
2707 3940506b 2005-01-13 devnull indgo[i] = YYFLAG1;
2708 3940506b 2005-01-13 devnull }
2709 3940506b 2005-01-13 devnull while((i = nxti()) != NOMORE)
2710 3940506b 2005-01-13 devnull if(i >= 0)
2711 3940506b 2005-01-13 devnull stin(i);
2712 3940506b 2005-01-13 devnull else
2713 3940506b 2005-01-13 devnull gin(-i);
2714 3940506b 2005-01-13 devnull
2715 3940506b 2005-01-13 devnull /* print amem array */
2716 3940506b 2005-01-13 devnull if(adb > 2 )
2717 3940506b 2005-01-13 devnull for(p = amem; p <= maxa; p += 10) {
2718 3940506b 2005-01-13 devnull Bprint(ftable, "%4d ", (int)(p-amem));
2719 3940506b 2005-01-13 devnull for(i = 0; i < 10; ++i)
2720 3940506b 2005-01-13 devnull Bprint(ftable, "%4d ", p[i]);
2721 3940506b 2005-01-13 devnull Bprint(ftable, "\n");
2722 3940506b 2005-01-13 devnull }
2723 3940506b 2005-01-13 devnull
2724 3940506b 2005-01-13 devnull /* write out the output appropriate to the language */
2725 3940506b 2005-01-13 devnull aoutput();
2726 3940506b 2005-01-13 devnull osummary();
2727 3940506b 2005-01-13 devnull ZAPFILE(tempname);
2728 3940506b 2005-01-13 devnull }
2729 3940506b 2005-01-13 devnull
2730 3940506b 2005-01-13 devnull void
2731 3940506b 2005-01-13 devnull gin(int i)
2732 3940506b 2005-01-13 devnull {
2733 3940506b 2005-01-13 devnull int *p, *r, *s, *q1, *q2;
2734 3940506b 2005-01-13 devnull
2735 3940506b 2005-01-13 devnull /* enter gotos on nonterminal i into array amem */
2736 3940506b 2005-01-13 devnull ggreed[i] = 0;
2737 3940506b 2005-01-13 devnull
2738 3940506b 2005-01-13 devnull q2 = mem0+ yypgo[i+1] - 1;
2739 3940506b 2005-01-13 devnull q1 = mem0 + yypgo[i];
2740 3940506b 2005-01-13 devnull
2741 3940506b 2005-01-13 devnull /* now, find amem place for it */
2742 3940506b 2005-01-13 devnull for(p = amem; p < &amem[ACTSIZE]; p++) {
2743 3940506b 2005-01-13 devnull if(*p)
2744 3940506b 2005-01-13 devnull continue;
2745 3940506b 2005-01-13 devnull for(r = q1; r < q2; r += 2) {
2746 3940506b 2005-01-13 devnull s = p + *r + 1;
2747 3940506b 2005-01-13 devnull if(*s)
2748 3940506b 2005-01-13 devnull goto nextgp;
2749 3940506b 2005-01-13 devnull if(s > maxa)
2750 3940506b 2005-01-13 devnull if((maxa = s) > &amem[ACTSIZE])
2751 3940506b 2005-01-13 devnull error("a array overflow");
2752 3940506b 2005-01-13 devnull }
2753 3940506b 2005-01-13 devnull /* we have found amem spot */
2754 3940506b 2005-01-13 devnull *p = *q2;
2755 3940506b 2005-01-13 devnull if(p > maxa)
2756 3940506b 2005-01-13 devnull if((maxa = p) > &amem[ACTSIZE])
2757 3940506b 2005-01-13 devnull error("a array overflow");
2758 3940506b 2005-01-13 devnull for(r = q1; r < q2; r += 2) {
2759 3940506b 2005-01-13 devnull s = p + *r + 1;
2760 3940506b 2005-01-13 devnull *s = r[1];
2761 3940506b 2005-01-13 devnull }
2762 3940506b 2005-01-13 devnull pgo[i] = p-amem;
2763 3940506b 2005-01-13 devnull if(adb > 1)
2764 3940506b 2005-01-13 devnull Bprint(ftable, "Nonterminal %d, entry at %d\n", i, pgo[i]);
2765 3940506b 2005-01-13 devnull return;
2766 3940506b 2005-01-13 devnull
2767 3940506b 2005-01-13 devnull nextgp:;
2768 3940506b 2005-01-13 devnull }
2769 3940506b 2005-01-13 devnull error("cannot place goto %d\n", i);
2770 3940506b 2005-01-13 devnull }
2771 3940506b 2005-01-13 devnull
2772 3940506b 2005-01-13 devnull void
2773 3940506b 2005-01-13 devnull stin(int i)
2774 3940506b 2005-01-13 devnull {
2775 3940506b 2005-01-13 devnull int *r, *s, n, flag, j, *q1, *q2;
2776 3940506b 2005-01-13 devnull
2777 3940506b 2005-01-13 devnull tystate[i] = 0;
2778 3940506b 2005-01-13 devnull
2779 3940506b 2005-01-13 devnull /* enter state i into the amem array */
2780 3940506b 2005-01-13 devnull q2 = mem0+temp1[i+1];
2781 3940506b 2005-01-13 devnull q1 = mem0+temp1[i];
2782 3940506b 2005-01-13 devnull /* find an acceptable place */
2783 3940506b 2005-01-13 devnull for(n = -maxoff; n < ACTSIZE; n++) {
2784 3940506b 2005-01-13 devnull flag = 0;
2785 3940506b 2005-01-13 devnull for(r = q1; r < q2; r += 2) {
2786 3940506b 2005-01-13 devnull if((s = *r + n + amem) < amem)
2787 3940506b 2005-01-13 devnull goto nextn;
2788 3940506b 2005-01-13 devnull if(*s == 0)
2789 3940506b 2005-01-13 devnull flag++;
2790 3940506b 2005-01-13 devnull else
2791 3940506b 2005-01-13 devnull if(*s != r[1])
2792 3940506b 2005-01-13 devnull goto nextn;
2793 3940506b 2005-01-13 devnull }
2794 3940506b 2005-01-13 devnull
2795 3940506b 2005-01-13 devnull /* check that the position equals another only if the states are identical */
2796 3940506b 2005-01-13 devnull for(j=0; j<nstate; j++) {
2797 3940506b 2005-01-13 devnull if(indgo[j] == n) {
2798 3940506b 2005-01-13 devnull
2799 3940506b 2005-01-13 devnull /* we have some disagreement */
2800 3940506b 2005-01-13 devnull if(flag)
2801 3940506b 2005-01-13 devnull goto nextn;
2802 3940506b 2005-01-13 devnull if(temp1[j+1]+temp1[i] == temp1[j]+temp1[i+1]) {
2803 3940506b 2005-01-13 devnull
2804 3940506b 2005-01-13 devnull /* states are equal */
2805 3940506b 2005-01-13 devnull indgo[i] = n;
2806 3940506b 2005-01-13 devnull if(adb > 1)
2807 3940506b 2005-01-13 devnull Bprint(ftable,
2808 3940506b 2005-01-13 devnull "State %d: entry at %d equals state %d\n",
2809 3940506b 2005-01-13 devnull i, n, j);
2810 3940506b 2005-01-13 devnull return;
2811 3940506b 2005-01-13 devnull }
2812 3940506b 2005-01-13 devnull
2813 3940506b 2005-01-13 devnull /* we have some disagreement */
2814 3940506b 2005-01-13 devnull goto nextn;
2815 3940506b 2005-01-13 devnull }
2816 3940506b 2005-01-13 devnull }
2817 3940506b 2005-01-13 devnull
2818 3940506b 2005-01-13 devnull for(r = q1; r < q2; r += 2) {
2819 3940506b 2005-01-13 devnull if((s = *r+n+amem) >= &amem[ACTSIZE])
2820 3940506b 2005-01-13 devnull error("out of space in optimizer a array");
2821 3940506b 2005-01-13 devnull if(s > maxa)
2822 3940506b 2005-01-13 devnull maxa = s;
2823 3940506b 2005-01-13 devnull if(*s != 0 && *s != r[1])
2824 3940506b 2005-01-13 devnull error("clobber of a array, pos'n %d, by %d", s-amem, r[1]);
2825 3940506b 2005-01-13 devnull *s = r[1];
2826 3940506b 2005-01-13 devnull }
2827 3940506b 2005-01-13 devnull indgo[i] = n;
2828 3940506b 2005-01-13 devnull if(adb > 1)
2829 3940506b 2005-01-13 devnull Bprint(ftable, "State %d: entry at %d\n", i, indgo[i]);
2830 3940506b 2005-01-13 devnull return;
2831 3940506b 2005-01-13 devnull nextn:;
2832 3940506b 2005-01-13 devnull }
2833 3940506b 2005-01-13 devnull error("Error; failure to place state %d\n", i);
2834 3940506b 2005-01-13 devnull }
2835 3940506b 2005-01-13 devnull
2836 3940506b 2005-01-13 devnull /*
2837 3940506b 2005-01-13 devnull * finds the next i
2838 3940506b 2005-01-13 devnull */
2839 3940506b 2005-01-13 devnull int
2840 3940506b 2005-01-13 devnull nxti(void)
2841 3940506b 2005-01-13 devnull {
2842 3940506b 2005-01-13 devnull int i, max, maxi;
2843 3940506b 2005-01-13 devnull
2844 3940506b 2005-01-13 devnull max = 0;
2845 3940506b 2005-01-13 devnull maxi = 0;
2846 3940506b 2005-01-13 devnull for(i = 1; i <= nnonter; i++)
2847 3940506b 2005-01-13 devnull if(ggreed[i] >= max) {
2848 3940506b 2005-01-13 devnull max = ggreed[i];
2849 3940506b 2005-01-13 devnull maxi = -i;
2850 3940506b 2005-01-13 devnull }
2851 3940506b 2005-01-13 devnull for(i = 0; i < nstate; ++i)
2852 3940506b 2005-01-13 devnull if(tystate[i] >= max) {
2853 3940506b 2005-01-13 devnull max = tystate[i];
2854 3940506b 2005-01-13 devnull maxi = i;
2855 3940506b 2005-01-13 devnull }
2856 3940506b 2005-01-13 devnull if(nxdb)
2857 3940506b 2005-01-13 devnull Bprint(ftable, "nxti = %d, max = %d\n", maxi, max);
2858 3940506b 2005-01-13 devnull if(max == 0)
2859 3940506b 2005-01-13 devnull return NOMORE;
2860 3940506b 2005-01-13 devnull return maxi;
2861 3940506b 2005-01-13 devnull }
2862 3940506b 2005-01-13 devnull
2863 3940506b 2005-01-13 devnull /*
2864 3940506b 2005-01-13 devnull * write summary
2865 3940506b 2005-01-13 devnull */
2866 3940506b 2005-01-13 devnull void
2867 3940506b 2005-01-13 devnull osummary(void)
2868 3940506b 2005-01-13 devnull {
2869 3940506b 2005-01-13 devnull
2870 3940506b 2005-01-13 devnull int i, *p;
2871 3940506b 2005-01-13 devnull
2872 3940506b 2005-01-13 devnull if(foutput == 0)
2873 3940506b 2005-01-13 devnull return;
2874 3940506b 2005-01-13 devnull i = 0;
2875 3940506b 2005-01-13 devnull for(p = maxa; p >= amem; p--)
2876 3940506b 2005-01-13 devnull if(*p == 0)
2877 3940506b 2005-01-13 devnull i++;
2878 3940506b 2005-01-13 devnull
2879 3940506b 2005-01-13 devnull Bprint(foutput, "Optimizer space used: input %d/%d, output %d/%d\n",
2880 3940506b 2005-01-13 devnull (int)(pmem-mem0+1), MEMSIZE, (int)(maxa-amem+1), ACTSIZE);
2881 3940506b 2005-01-13 devnull Bprint(foutput, "%d table entries, %d zero\n", (int)(maxa-amem+1), i);
2882 3940506b 2005-01-13 devnull Bprint(foutput, "maximum spread: %d, maximum offset: %d\n", maxspr, maxoff);
2883 3940506b 2005-01-13 devnull }
2884 3940506b 2005-01-13 devnull
2885 3940506b 2005-01-13 devnull /*
2886 3940506b 2005-01-13 devnull * this version is for C
2887 3940506b 2005-01-13 devnull * write out the optimized parser
2888 3940506b 2005-01-13 devnull */
2889 3940506b 2005-01-13 devnull void
2890 3940506b 2005-01-13 devnull aoutput(void)
2891 3940506b 2005-01-13 devnull {
2892 3940506b 2005-01-13 devnull Bprint(ftable, "#define\tYYLAST\t%d\n", (int)(maxa-amem+1));
2893 3940506b 2005-01-13 devnull arout("yyact", amem, (maxa-amem)+1);
2894 3940506b 2005-01-13 devnull arout("yypact", indgo, nstate);
2895 3940506b 2005-01-13 devnull arout("yypgo", pgo, nnonter+1);
2896 3940506b 2005-01-13 devnull }
2897 3940506b 2005-01-13 devnull
2898 3940506b 2005-01-13 devnull void
2899 3940506b 2005-01-13 devnull arout(char *s, int *v, int n)
2900 3940506b 2005-01-13 devnull {
2901 3940506b 2005-01-13 devnull int i;
2902 3940506b 2005-01-13 devnull
2903 3940506b 2005-01-13 devnull Bprint(ftable, "short %s[] =\n{", s);
2904 3940506b 2005-01-13 devnull for(i = 0; i < n;) {
2905 3940506b 2005-01-13 devnull if(i%10 == 0)
2906 3940506b 2005-01-13 devnull Bprint(ftable, "\n");
2907 3940506b 2005-01-13 devnull Bprint(ftable, "%4d", v[i]);
2908 3940506b 2005-01-13 devnull i++;
2909 3940506b 2005-01-13 devnull if(i == n)
2910 3940506b 2005-01-13 devnull Bprint(ftable, "\n};\n");
2911 3940506b 2005-01-13 devnull else
2912 3940506b 2005-01-13 devnull Bprint(ftable, ",");
2913 3940506b 2005-01-13 devnull }
2914 3940506b 2005-01-13 devnull }
2915 3940506b 2005-01-13 devnull
2916 3940506b 2005-01-13 devnull /*
2917 3940506b 2005-01-13 devnull * read and convert an integer from the standard input
2918 3940506b 2005-01-13 devnull * return the terminating character
2919 3940506b 2005-01-13 devnull * blanks, tabs, and newlines are ignored
2920 3940506b 2005-01-13 devnull */
2921 3940506b 2005-01-13 devnull int
2922 3940506b 2005-01-13 devnull gtnm(void)
2923 3940506b 2005-01-13 devnull {
2924 3940506b 2005-01-13 devnull int sign, val, c;
2925 3940506b 2005-01-13 devnull
2926 3940506b 2005-01-13 devnull sign = 0;
2927 3940506b 2005-01-13 devnull val = 0;
2928 3940506b 2005-01-13 devnull while((c=Bgetrune(finput)) != Beof) {
2929 3940506b 2005-01-13 devnull if(isdigit(c)) {
2930 3940506b 2005-01-13 devnull val = val*10 + c-'0';
2931 3940506b 2005-01-13 devnull continue;
2932 3940506b 2005-01-13 devnull }
2933 3940506b 2005-01-13 devnull if(c == '-') {
2934 3940506b 2005-01-13 devnull sign = 1;
2935 3940506b 2005-01-13 devnull continue;
2936 3940506b 2005-01-13 devnull }
2937 3940506b 2005-01-13 devnull break;
2938 3940506b 2005-01-13 devnull }
2939 3940506b 2005-01-13 devnull if(sign)
2940 3940506b 2005-01-13 devnull val = -val;
2941 3940506b 2005-01-13 devnull *pmem++ = val;
2942 3940506b 2005-01-13 devnull if(pmem >= &mem0[MEMSIZE])
2943 3940506b 2005-01-13 devnull error("out of space");
2944 3940506b 2005-01-13 devnull return c;
2945 3940506b 2005-01-13 devnull }