Blame


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