Blame


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