Blame


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