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