Blame


1 e37302c4 2004-04-21 devnull # include "ldefs.h"
2 e37302c4 2004-04-21 devnull uchar *
3 e37302c4 2004-04-21 devnull getl(uchar *p) /* return next line of input, throw away trailing '\n' */
4 e37302c4 2004-04-21 devnull /* returns 0 if eof is had immediately */
5 e37302c4 2004-04-21 devnull {
6 e37302c4 2004-04-21 devnull int c;
7 e37302c4 2004-04-21 devnull uchar *s, *t;
8 e37302c4 2004-04-21 devnull
9 e37302c4 2004-04-21 devnull t = s = p;
10 e37302c4 2004-04-21 devnull while(((c = gch()) != 0) && c != '\n')
11 e37302c4 2004-04-21 devnull *t++ = c;
12 e37302c4 2004-04-21 devnull *t = 0;
13 e37302c4 2004-04-21 devnull if(c == 0 && s == t) return((uchar *)0);
14 e37302c4 2004-04-21 devnull prev = '\n';
15 e37302c4 2004-04-21 devnull pres = '\n';
16 e37302c4 2004-04-21 devnull return(s);
17 e37302c4 2004-04-21 devnull }
18 e37302c4 2004-04-21 devnull
19 e37302c4 2004-04-21 devnull void
20 e37302c4 2004-04-21 devnull printerr(char *type, char *fmt, va_list argl)
21 e37302c4 2004-04-21 devnull {
22 e37302c4 2004-04-21 devnull char buf[1024];
23 e37302c4 2004-04-21 devnull
24 e37302c4 2004-04-21 devnull if(!eof)fprint(errorf,"%d: ",yyline);
25 e37302c4 2004-04-21 devnull fprint(errorf,"(%s) ", type);
26 e37302c4 2004-04-21 devnull vseprint(buf, buf+sizeof(buf), fmt, argl);
27 e37302c4 2004-04-21 devnull fprint(errorf, "%s\n", buf);
28 e37302c4 2004-04-21 devnull }
29 e37302c4 2004-04-21 devnull
30 e37302c4 2004-04-21 devnull
31 e37302c4 2004-04-21 devnull void
32 e37302c4 2004-04-21 devnull error(char *s,...)
33 e37302c4 2004-04-21 devnull {
34 e37302c4 2004-04-21 devnull va_list argl;
35 e37302c4 2004-04-21 devnull
36 e37302c4 2004-04-21 devnull va_start(argl, s);
37 e37302c4 2004-04-21 devnull printerr("Error", s, argl);
38 e37302c4 2004-04-21 devnull va_end(argl);
39 e37302c4 2004-04-21 devnull # ifdef DEBUG
40 e37302c4 2004-04-21 devnull if(debug && sect != ENDSECTION) {
41 e37302c4 2004-04-21 devnull sect1dump();
42 e37302c4 2004-04-21 devnull sect2dump();
43 e37302c4 2004-04-21 devnull }
44 e37302c4 2004-04-21 devnull # endif
45 e37302c4 2004-04-21 devnull if(
46 e37302c4 2004-04-21 devnull # ifdef DEBUG
47 e37302c4 2004-04-21 devnull debug ||
48 e37302c4 2004-04-21 devnull # endif
49 e37302c4 2004-04-21 devnull report == 1) statistics();
50 e37302c4 2004-04-21 devnull exits("error"); /* error return code */
51 e37302c4 2004-04-21 devnull }
52 e37302c4 2004-04-21 devnull
53 e37302c4 2004-04-21 devnull void
54 e37302c4 2004-04-21 devnull warning(char *s,...)
55 e37302c4 2004-04-21 devnull {
56 e37302c4 2004-04-21 devnull va_list argl;
57 e37302c4 2004-04-21 devnull
58 e37302c4 2004-04-21 devnull va_start(argl, s);
59 e37302c4 2004-04-21 devnull printerr("Warning", s, argl);
60 e37302c4 2004-04-21 devnull va_end(argl);
61 e37302c4 2004-04-21 devnull Bflush(&fout);
62 e37302c4 2004-04-21 devnull }
63 e37302c4 2004-04-21 devnull
64 e37302c4 2004-04-21 devnull void
65 e37302c4 2004-04-21 devnull lgate(void)
66 e37302c4 2004-04-21 devnull {
67 e37302c4 2004-04-21 devnull int fd;
68 e37302c4 2004-04-21 devnull
69 e37302c4 2004-04-21 devnull if (lgatflg) return;
70 e37302c4 2004-04-21 devnull lgatflg=1;
71 e37302c4 2004-04-21 devnull if(foutopen == 0){
72 e37302c4 2004-04-21 devnull fd = create("lex.yy.c", OWRITE, 0666);
73 e37302c4 2004-04-21 devnull if(fd < 0)
74 e37302c4 2004-04-21 devnull error("Can't open lex.yy.c");
75 e37302c4 2004-04-21 devnull Binit(&fout, fd, OWRITE);
76 e37302c4 2004-04-21 devnull foutopen = 1;
77 e37302c4 2004-04-21 devnull }
78 e37302c4 2004-04-21 devnull phead1();
79 e37302c4 2004-04-21 devnull }
80 e37302c4 2004-04-21 devnull
81 e37302c4 2004-04-21 devnull void
82 e37302c4 2004-04-21 devnull cclinter(int sw)
83 e37302c4 2004-04-21 devnull {
84 e37302c4 2004-04-21 devnull /* sw = 1 ==> ccl */
85 e37302c4 2004-04-21 devnull int i, j, k;
86 e37302c4 2004-04-21 devnull int m;
87 e37302c4 2004-04-21 devnull if(!sw){ /* is NCCL */
88 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++)
89 e37302c4 2004-04-21 devnull symbol[i] ^= 1; /* reverse value */
90 e37302c4 2004-04-21 devnull }
91 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++)
92 e37302c4 2004-04-21 devnull if(symbol[i]) break;
93 e37302c4 2004-04-21 devnull if(i >= NCH) return;
94 e37302c4 2004-04-21 devnull i = cindex[i];
95 e37302c4 2004-04-21 devnull /* see if ccl is already in our table */
96 e37302c4 2004-04-21 devnull j = 0;
97 e37302c4 2004-04-21 devnull if(i){
98 e37302c4 2004-04-21 devnull for(j=1;j<NCH;j++){
99 e37302c4 2004-04-21 devnull if((symbol[j] && cindex[j] != i) ||
100 e37302c4 2004-04-21 devnull (!symbol[j] && cindex[j] == i)) break;
101 e37302c4 2004-04-21 devnull }
102 e37302c4 2004-04-21 devnull }
103 e37302c4 2004-04-21 devnull if(j >= NCH) return; /* already in */
104 e37302c4 2004-04-21 devnull m = 0;
105 e37302c4 2004-04-21 devnull k = 0;
106 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++)
107 e37302c4 2004-04-21 devnull if(symbol[i]){
108 e37302c4 2004-04-21 devnull if(!cindex[i]){
109 e37302c4 2004-04-21 devnull cindex[i] = ccount;
110 e37302c4 2004-04-21 devnull symbol[i] = 0;
111 e37302c4 2004-04-21 devnull m = 1;
112 e37302c4 2004-04-21 devnull } else k = 1;
113 e37302c4 2004-04-21 devnull }
114 e37302c4 2004-04-21 devnull /* m == 1 implies last value of ccount has been used */
115 e37302c4 2004-04-21 devnull if(m)ccount++;
116 e37302c4 2004-04-21 devnull if(k == 0) return; /* is now in as ccount wholly */
117 e37302c4 2004-04-21 devnull /* intersection must be computed */
118 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++){
119 e37302c4 2004-04-21 devnull if(symbol[i]){
120 e37302c4 2004-04-21 devnull m = 0;
121 e37302c4 2004-04-21 devnull j = cindex[i]; /* will be non-zero */
122 e37302c4 2004-04-21 devnull for(k=1;k<NCH;k++){
123 e37302c4 2004-04-21 devnull if(cindex[k] == j){
124 e37302c4 2004-04-21 devnull if(symbol[k]) symbol[k] = 0;
125 e37302c4 2004-04-21 devnull else {
126 e37302c4 2004-04-21 devnull cindex[k] = ccount;
127 e37302c4 2004-04-21 devnull m = 1;
128 e37302c4 2004-04-21 devnull }
129 e37302c4 2004-04-21 devnull }
130 e37302c4 2004-04-21 devnull }
131 e37302c4 2004-04-21 devnull if(m)ccount++;
132 e37302c4 2004-04-21 devnull }
133 e37302c4 2004-04-21 devnull }
134 e37302c4 2004-04-21 devnull }
135 e37302c4 2004-04-21 devnull
136 e37302c4 2004-04-21 devnull int
137 e37302c4 2004-04-21 devnull usescape(int c)
138 e37302c4 2004-04-21 devnull {
139 e37302c4 2004-04-21 devnull int d;
140 e37302c4 2004-04-21 devnull switch(c){
141 e37302c4 2004-04-21 devnull case 'n': c = '\n'; break;
142 e37302c4 2004-04-21 devnull case 'r': c = '\r'; break;
143 e37302c4 2004-04-21 devnull case 't': c = '\t'; break;
144 e37302c4 2004-04-21 devnull case 'b': c = '\b'; break;
145 e37302c4 2004-04-21 devnull case 'f': c = 014; break; /* form feed for ascii */
146 e37302c4 2004-04-21 devnull case '0': case '1': case '2': case '3':
147 e37302c4 2004-04-21 devnull case '4': case '5': case '6': case '7':
148 e37302c4 2004-04-21 devnull c -= '0';
149 e37302c4 2004-04-21 devnull while('0' <= (d=gch()) && d <= '7'){
150 e37302c4 2004-04-21 devnull c = c * 8 + (d-'0');
151 e37302c4 2004-04-21 devnull if(!('0' <= peek && peek <= '7')) break;
152 e37302c4 2004-04-21 devnull }
153 e37302c4 2004-04-21 devnull break;
154 e37302c4 2004-04-21 devnull }
155 e37302c4 2004-04-21 devnull return(c);
156 e37302c4 2004-04-21 devnull }
157 e37302c4 2004-04-21 devnull
158 e37302c4 2004-04-21 devnull int
159 e37302c4 2004-04-21 devnull lookup(uchar *s, uchar **t)
160 e37302c4 2004-04-21 devnull {
161 e37302c4 2004-04-21 devnull int i;
162 e37302c4 2004-04-21 devnull i = 0;
163 e37302c4 2004-04-21 devnull while(*t){
164 e37302c4 2004-04-21 devnull if(strcmp((char *)s, *(char **)t) == 0)
165 e37302c4 2004-04-21 devnull return(i);
166 e37302c4 2004-04-21 devnull i++;
167 e37302c4 2004-04-21 devnull t++;
168 e37302c4 2004-04-21 devnull }
169 e37302c4 2004-04-21 devnull return(-1);
170 e37302c4 2004-04-21 devnull }
171 e37302c4 2004-04-21 devnull
172 e37302c4 2004-04-21 devnull int
173 e37302c4 2004-04-21 devnull cpyact(void)
174 e37302c4 2004-04-21 devnull { /* copy C action to the next ; or closing } */
175 e37302c4 2004-04-21 devnull int brac, c, mth;
176 e37302c4 2004-04-21 devnull int savline, sw;
177 e37302c4 2004-04-21 devnull
178 e37302c4 2004-04-21 devnull brac = 0;
179 e37302c4 2004-04-21 devnull sw = TRUE;
180 e37302c4 2004-04-21 devnull savline = 0;
181 e37302c4 2004-04-21 devnull
182 e37302c4 2004-04-21 devnull while(!eof){
183 e37302c4 2004-04-21 devnull c = gch();
184 e37302c4 2004-04-21 devnull swt:
185 e37302c4 2004-04-21 devnull switch( c ){
186 e37302c4 2004-04-21 devnull
187 e37302c4 2004-04-21 devnull case '|': if(brac == 0 && sw == TRUE){
188 e37302c4 2004-04-21 devnull if(peek == '|')gch(); /* eat up an extra '|' */
189 e37302c4 2004-04-21 devnull return(0);
190 e37302c4 2004-04-21 devnull }
191 e37302c4 2004-04-21 devnull break;
192 e37302c4 2004-04-21 devnull
193 e37302c4 2004-04-21 devnull case ';':
194 e37302c4 2004-04-21 devnull if( brac == 0 ){
195 e37302c4 2004-04-21 devnull Bputc(&fout, c);
196 e37302c4 2004-04-21 devnull Bputc(&fout, '\n');
197 e37302c4 2004-04-21 devnull return(1);
198 e37302c4 2004-04-21 devnull }
199 e37302c4 2004-04-21 devnull break;
200 e37302c4 2004-04-21 devnull
201 e37302c4 2004-04-21 devnull case '{':
202 e37302c4 2004-04-21 devnull brac++;
203 e37302c4 2004-04-21 devnull savline=yyline;
204 e37302c4 2004-04-21 devnull break;
205 e37302c4 2004-04-21 devnull
206 e37302c4 2004-04-21 devnull case '}':
207 e37302c4 2004-04-21 devnull brac--;
208 e37302c4 2004-04-21 devnull if( brac == 0 ){
209 e37302c4 2004-04-21 devnull Bputc(&fout, c);
210 e37302c4 2004-04-21 devnull Bputc(&fout, '\n');
211 e37302c4 2004-04-21 devnull return(1);
212 e37302c4 2004-04-21 devnull }
213 e37302c4 2004-04-21 devnull break;
214 e37302c4 2004-04-21 devnull
215 e37302c4 2004-04-21 devnull case '/': /* look for comments */
216 e37302c4 2004-04-21 devnull Bputc(&fout, c);
217 e37302c4 2004-04-21 devnull c = gch();
218 e37302c4 2004-04-21 devnull if( c != '*' ) goto swt;
219 e37302c4 2004-04-21 devnull
220 e37302c4 2004-04-21 devnull /* it really is a comment */
221 e37302c4 2004-04-21 devnull
222 e37302c4 2004-04-21 devnull Bputc(&fout, c);
223 e37302c4 2004-04-21 devnull savline=yyline;
224 e37302c4 2004-04-21 devnull while( c=gch() ){
225 e37302c4 2004-04-21 devnull if( c=='*' ){
226 e37302c4 2004-04-21 devnull Bputc(&fout, c);
227 e37302c4 2004-04-21 devnull if( (c=gch()) == '/' ) goto loop;
228 e37302c4 2004-04-21 devnull }
229 e37302c4 2004-04-21 devnull Bputc(&fout, c);
230 e37302c4 2004-04-21 devnull }
231 e37302c4 2004-04-21 devnull yyline=savline;
232 e37302c4 2004-04-21 devnull error( "EOF inside comment" );
233 e37302c4 2004-04-21 devnull
234 e37302c4 2004-04-21 devnull case '\'': /* character constant */
235 e37302c4 2004-04-21 devnull mth = '\'';
236 e37302c4 2004-04-21 devnull goto string;
237 e37302c4 2004-04-21 devnull
238 e37302c4 2004-04-21 devnull case '"': /* character string */
239 e37302c4 2004-04-21 devnull mth = '"';
240 e37302c4 2004-04-21 devnull
241 e37302c4 2004-04-21 devnull string:
242 e37302c4 2004-04-21 devnull
243 e37302c4 2004-04-21 devnull Bputc(&fout, c);
244 e37302c4 2004-04-21 devnull while( c=gch() ){
245 e37302c4 2004-04-21 devnull if( c=='\\' ){
246 e37302c4 2004-04-21 devnull Bputc(&fout, c);
247 e37302c4 2004-04-21 devnull c=gch();
248 e37302c4 2004-04-21 devnull }
249 e37302c4 2004-04-21 devnull else if( c==mth ) goto loop;
250 e37302c4 2004-04-21 devnull Bputc(&fout, c);
251 e37302c4 2004-04-21 devnull if (c == '\n') {
252 e37302c4 2004-04-21 devnull yyline--;
253 e37302c4 2004-04-21 devnull error( "Non-terminated string or character constant");
254 e37302c4 2004-04-21 devnull }
255 e37302c4 2004-04-21 devnull }
256 e37302c4 2004-04-21 devnull error( "EOF in string or character constant" );
257 e37302c4 2004-04-21 devnull
258 e37302c4 2004-04-21 devnull case '\0':
259 e37302c4 2004-04-21 devnull yyline = savline;
260 e37302c4 2004-04-21 devnull error("Action does not terminate");
261 e37302c4 2004-04-21 devnull default:
262 e37302c4 2004-04-21 devnull break; /* usual character */
263 e37302c4 2004-04-21 devnull }
264 e37302c4 2004-04-21 devnull loop:
265 e37302c4 2004-04-21 devnull if(c != ' ' && c != '\t' && c != '\n') sw = FALSE;
266 e37302c4 2004-04-21 devnull Bputc(&fout, c);
267 e37302c4 2004-04-21 devnull }
268 e37302c4 2004-04-21 devnull error("Premature EOF");
269 e37302c4 2004-04-21 devnull return(0);
270 e37302c4 2004-04-21 devnull }
271 e37302c4 2004-04-21 devnull
272 e37302c4 2004-04-21 devnull int
273 e37302c4 2004-04-21 devnull gch(void){
274 e37302c4 2004-04-21 devnull int c;
275 e37302c4 2004-04-21 devnull prev = pres;
276 e37302c4 2004-04-21 devnull c = pres = peek;
277 e37302c4 2004-04-21 devnull peek = pushptr > pushc ? *--pushptr : Bgetc(fin);
278 e37302c4 2004-04-21 devnull if(peek == Beof && sargc > 1){
279 e37302c4 2004-04-21 devnull Bterm(fin);
280 e37302c4 2004-04-21 devnull fin = Bopen(sargv[fptr++],OREAD);
281 e37302c4 2004-04-21 devnull if(fin == 0)
282 e37302c4 2004-04-21 devnull error("Cannot open file %s",sargv[fptr-1]);
283 e37302c4 2004-04-21 devnull peek = Bgetc(fin);
284 e37302c4 2004-04-21 devnull sargc--;
285 e37302c4 2004-04-21 devnull sargv++;
286 e37302c4 2004-04-21 devnull }
287 e37302c4 2004-04-21 devnull if(c == Beof) {
288 e37302c4 2004-04-21 devnull eof = TRUE;
289 e37302c4 2004-04-21 devnull Bterm(fin);
290 e37302c4 2004-04-21 devnull return(0);
291 e37302c4 2004-04-21 devnull }
292 e37302c4 2004-04-21 devnull if(c == '\n')yyline++;
293 e37302c4 2004-04-21 devnull return(c);
294 e37302c4 2004-04-21 devnull }
295 e37302c4 2004-04-21 devnull
296 e37302c4 2004-04-21 devnull int
297 e37302c4 2004-04-21 devnull mn2(int a, int d, int c)
298 e37302c4 2004-04-21 devnull {
299 e37302c4 2004-04-21 devnull name[tptr] = a;
300 e37302c4 2004-04-21 devnull left[tptr] = d;
301 e37302c4 2004-04-21 devnull right[tptr] = c;
302 e37302c4 2004-04-21 devnull parent[tptr] = 0;
303 e37302c4 2004-04-21 devnull nullstr[tptr] = 0;
304 e37302c4 2004-04-21 devnull switch(a){
305 e37302c4 2004-04-21 devnull case RSTR:
306 e37302c4 2004-04-21 devnull parent[d] = tptr;
307 e37302c4 2004-04-21 devnull break;
308 e37302c4 2004-04-21 devnull case BAR:
309 e37302c4 2004-04-21 devnull case RNEWE:
310 e37302c4 2004-04-21 devnull if(nullstr[d] || nullstr[c]) nullstr[tptr] = TRUE;
311 e37302c4 2004-04-21 devnull parent[d] = parent[c] = tptr;
312 e37302c4 2004-04-21 devnull break;
313 e37302c4 2004-04-21 devnull case RCAT:
314 e37302c4 2004-04-21 devnull case DIV:
315 e37302c4 2004-04-21 devnull if(nullstr[d] && nullstr[c])nullstr[tptr] = TRUE;
316 e37302c4 2004-04-21 devnull parent[d] = parent[c] = tptr;
317 e37302c4 2004-04-21 devnull break;
318 e37302c4 2004-04-21 devnull case RSCON:
319 e37302c4 2004-04-21 devnull parent[d] = tptr;
320 e37302c4 2004-04-21 devnull nullstr[tptr] = nullstr[d];
321 e37302c4 2004-04-21 devnull break;
322 e37302c4 2004-04-21 devnull # ifdef DEBUG
323 e37302c4 2004-04-21 devnull default:
324 e37302c4 2004-04-21 devnull warning("bad switch mn2 %d %d",a,d);
325 e37302c4 2004-04-21 devnull break;
326 e37302c4 2004-04-21 devnull # endif
327 e37302c4 2004-04-21 devnull }
328 e37302c4 2004-04-21 devnull if(tptr > treesize)
329 e37302c4 2004-04-21 devnull error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":""));
330 e37302c4 2004-04-21 devnull return(tptr++);
331 e37302c4 2004-04-21 devnull }
332 e37302c4 2004-04-21 devnull
333 e37302c4 2004-04-21 devnull int
334 e37302c4 2004-04-21 devnull mn1(int a, int d)
335 e37302c4 2004-04-21 devnull {
336 e37302c4 2004-04-21 devnull name[tptr] = a;
337 e37302c4 2004-04-21 devnull left[tptr] = d;
338 e37302c4 2004-04-21 devnull parent[tptr] = 0;
339 e37302c4 2004-04-21 devnull nullstr[tptr] = 0;
340 e37302c4 2004-04-21 devnull switch(a){
341 e37302c4 2004-04-21 devnull case RCCL:
342 e37302c4 2004-04-21 devnull case RNCCL:
343 e37302c4 2004-04-21 devnull if(strlen((char *)d) == 0) nullstr[tptr] = TRUE;
344 e37302c4 2004-04-21 devnull break;
345 e37302c4 2004-04-21 devnull case STAR:
346 e37302c4 2004-04-21 devnull case QUEST:
347 e37302c4 2004-04-21 devnull nullstr[tptr] = TRUE;
348 e37302c4 2004-04-21 devnull parent[d] = tptr;
349 e37302c4 2004-04-21 devnull break;
350 e37302c4 2004-04-21 devnull case PLUS:
351 e37302c4 2004-04-21 devnull case CARAT:
352 e37302c4 2004-04-21 devnull nullstr[tptr] = nullstr[d];
353 e37302c4 2004-04-21 devnull parent[d] = tptr;
354 e37302c4 2004-04-21 devnull break;
355 e37302c4 2004-04-21 devnull case S2FINAL:
356 e37302c4 2004-04-21 devnull nullstr[tptr] = TRUE;
357 e37302c4 2004-04-21 devnull break;
358 e37302c4 2004-04-21 devnull # ifdef DEBUG
359 e37302c4 2004-04-21 devnull case FINAL:
360 e37302c4 2004-04-21 devnull case S1FINAL:
361 e37302c4 2004-04-21 devnull break;
362 e37302c4 2004-04-21 devnull default:
363 e37302c4 2004-04-21 devnull warning("bad switch mn1 %d %d",a,d);
364 e37302c4 2004-04-21 devnull break;
365 e37302c4 2004-04-21 devnull # endif
366 e37302c4 2004-04-21 devnull }
367 e37302c4 2004-04-21 devnull if(tptr > treesize)
368 e37302c4 2004-04-21 devnull error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":""));
369 e37302c4 2004-04-21 devnull return(tptr++);
370 e37302c4 2004-04-21 devnull }
371 e37302c4 2004-04-21 devnull
372 e37302c4 2004-04-21 devnull int
373 e37302c4 2004-04-21 devnull mn0(int a)
374 e37302c4 2004-04-21 devnull {
375 e37302c4 2004-04-21 devnull name[tptr] = a;
376 e37302c4 2004-04-21 devnull parent[tptr] = 0;
377 e37302c4 2004-04-21 devnull nullstr[tptr] = 0;
378 e37302c4 2004-04-21 devnull if(a >= NCH) switch(a){
379 e37302c4 2004-04-21 devnull case RNULLS: nullstr[tptr] = TRUE; break;
380 e37302c4 2004-04-21 devnull # ifdef DEBUG
381 e37302c4 2004-04-21 devnull default:
382 e37302c4 2004-04-21 devnull warning("bad switch mn0 %d",a);
383 e37302c4 2004-04-21 devnull break;
384 e37302c4 2004-04-21 devnull # endif
385 e37302c4 2004-04-21 devnull }
386 e37302c4 2004-04-21 devnull if(tptr > treesize)
387 e37302c4 2004-04-21 devnull error("Parse tree too big %s",(treesize == TREESIZE?"\nTry using %e num":""));
388 e37302c4 2004-04-21 devnull return(tptr++);
389 e37302c4 2004-04-21 devnull }
390 e37302c4 2004-04-21 devnull
391 e37302c4 2004-04-21 devnull void
392 e37302c4 2004-04-21 devnull munputc(int p)
393 e37302c4 2004-04-21 devnull {
394 e37302c4 2004-04-21 devnull *pushptr++ = peek; /* watch out for this */
395 e37302c4 2004-04-21 devnull peek = p;
396 e37302c4 2004-04-21 devnull if(pushptr >= pushc+TOKENSIZE)
397 e37302c4 2004-04-21 devnull error("Too many characters pushed");
398 e37302c4 2004-04-21 devnull }
399 e37302c4 2004-04-21 devnull
400 e37302c4 2004-04-21 devnull void
401 e37302c4 2004-04-21 devnull munputs(uchar *p)
402 e37302c4 2004-04-21 devnull {
403 e37302c4 2004-04-21 devnull int i,j;
404 e37302c4 2004-04-21 devnull *pushptr++ = peek;
405 e37302c4 2004-04-21 devnull peek = p[0];
406 e37302c4 2004-04-21 devnull i = strlen((char*)p);
407 e37302c4 2004-04-21 devnull for(j = i-1; j>=1; j--)
408 e37302c4 2004-04-21 devnull *pushptr++ = p[j];
409 e37302c4 2004-04-21 devnull if(pushptr >= pushc+TOKENSIZE)
410 e37302c4 2004-04-21 devnull error("Too many characters pushed");
411 e37302c4 2004-04-21 devnull }
412 e37302c4 2004-04-21 devnull
413 e37302c4 2004-04-21 devnull int
414 e37302c4 2004-04-21 devnull dupl(int n)
415 e37302c4 2004-04-21 devnull {
416 e37302c4 2004-04-21 devnull /* duplicate the subtree whose root is n, return ptr to it */
417 e37302c4 2004-04-21 devnull int i;
418 e37302c4 2004-04-21 devnull
419 e37302c4 2004-04-21 devnull i = name[n];
420 e37302c4 2004-04-21 devnull if(i < NCH) return(mn0(i));
421 e37302c4 2004-04-21 devnull switch(i){
422 e37302c4 2004-04-21 devnull case RNULLS:
423 e37302c4 2004-04-21 devnull return(mn0(i));
424 e37302c4 2004-04-21 devnull case RCCL: case RNCCL: case FINAL: case S1FINAL: case S2FINAL:
425 e37302c4 2004-04-21 devnull return(mn1(i,left[n]));
426 e37302c4 2004-04-21 devnull case STAR: case QUEST: case PLUS: case CARAT:
427 e37302c4 2004-04-21 devnull return(mn1(i,dupl(left[n])));
428 e37302c4 2004-04-21 devnull case RSTR: case RSCON:
429 e37302c4 2004-04-21 devnull return(mn2(i,dupl(left[n]),right[n]));
430 e37302c4 2004-04-21 devnull case BAR: case RNEWE: case RCAT: case DIV:
431 e37302c4 2004-04-21 devnull return(mn2(i,dupl(left[n]),dupl(right[n])));
432 e37302c4 2004-04-21 devnull # ifdef DEBUG
433 e37302c4 2004-04-21 devnull default:
434 e37302c4 2004-04-21 devnull warning("bad switch dupl %d",n);
435 e37302c4 2004-04-21 devnull # endif
436 e37302c4 2004-04-21 devnull }
437 e37302c4 2004-04-21 devnull return(0);
438 e37302c4 2004-04-21 devnull }
439 e37302c4 2004-04-21 devnull
440 e37302c4 2004-04-21 devnull # ifdef DEBUG
441 e37302c4 2004-04-21 devnull void
442 e37302c4 2004-04-21 devnull allprint(int c)
443 e37302c4 2004-04-21 devnull {
444 e37302c4 2004-04-21 devnull switch(c){
445 e37302c4 2004-04-21 devnull case 014:
446 e37302c4 2004-04-21 devnull print("\\f");
447 e37302c4 2004-04-21 devnull charc++;
448 e37302c4 2004-04-21 devnull break;
449 e37302c4 2004-04-21 devnull case '\n':
450 e37302c4 2004-04-21 devnull print("\\n");
451 e37302c4 2004-04-21 devnull charc++;
452 e37302c4 2004-04-21 devnull break;
453 e37302c4 2004-04-21 devnull case '\t':
454 e37302c4 2004-04-21 devnull print("\\t");
455 e37302c4 2004-04-21 devnull charc++;
456 e37302c4 2004-04-21 devnull break;
457 e37302c4 2004-04-21 devnull case '\b':
458 e37302c4 2004-04-21 devnull print("\\b");
459 e37302c4 2004-04-21 devnull charc++;
460 e37302c4 2004-04-21 devnull break;
461 e37302c4 2004-04-21 devnull case ' ':
462 e37302c4 2004-04-21 devnull print("\\\bb");
463 e37302c4 2004-04-21 devnull break;
464 e37302c4 2004-04-21 devnull default:
465 e37302c4 2004-04-21 devnull if(!isprint(c)){
466 e37302c4 2004-04-21 devnull print("\\%-3o",c);
467 e37302c4 2004-04-21 devnull charc += 3;
468 e37302c4 2004-04-21 devnull } else
469 e37302c4 2004-04-21 devnull print("%c", c);
470 e37302c4 2004-04-21 devnull break;
471 e37302c4 2004-04-21 devnull }
472 e37302c4 2004-04-21 devnull charc++;
473 e37302c4 2004-04-21 devnull }
474 e37302c4 2004-04-21 devnull
475 e37302c4 2004-04-21 devnull void
476 e37302c4 2004-04-21 devnull strpt(uchar *s)
477 e37302c4 2004-04-21 devnull {
478 e37302c4 2004-04-21 devnull charc = 0;
479 e37302c4 2004-04-21 devnull while(*s){
480 e37302c4 2004-04-21 devnull allprint(*s++);
481 e37302c4 2004-04-21 devnull if(charc > LINESIZE){
482 e37302c4 2004-04-21 devnull charc = 0;
483 e37302c4 2004-04-21 devnull print("\n\t");
484 e37302c4 2004-04-21 devnull }
485 e37302c4 2004-04-21 devnull }
486 e37302c4 2004-04-21 devnull }
487 e37302c4 2004-04-21 devnull
488 e37302c4 2004-04-21 devnull void
489 e37302c4 2004-04-21 devnull sect1dump(void)
490 e37302c4 2004-04-21 devnull {
491 e37302c4 2004-04-21 devnull int i;
492 e37302c4 2004-04-21 devnull
493 e37302c4 2004-04-21 devnull print("Sect 1:\n");
494 e37302c4 2004-04-21 devnull if(def[0]){
495 e37302c4 2004-04-21 devnull print("str trans\n");
496 e37302c4 2004-04-21 devnull i = -1;
497 e37302c4 2004-04-21 devnull while(def[++i])
498 e37302c4 2004-04-21 devnull print("%s\t%s\n",def[i],subs[i]);
499 e37302c4 2004-04-21 devnull }
500 e37302c4 2004-04-21 devnull if(sname[0]){
501 e37302c4 2004-04-21 devnull print("start names\n");
502 e37302c4 2004-04-21 devnull i = -1;
503 e37302c4 2004-04-21 devnull while(sname[++i])
504 e37302c4 2004-04-21 devnull print("%s\n",sname[i]);
505 e37302c4 2004-04-21 devnull }
506 e37302c4 2004-04-21 devnull }
507 e37302c4 2004-04-21 devnull
508 e37302c4 2004-04-21 devnull void
509 e37302c4 2004-04-21 devnull sect2dump(void)
510 e37302c4 2004-04-21 devnull {
511 e37302c4 2004-04-21 devnull print("Sect 2:\n");
512 e37302c4 2004-04-21 devnull treedump();
513 e37302c4 2004-04-21 devnull }
514 e37302c4 2004-04-21 devnull
515 e37302c4 2004-04-21 devnull void
516 e37302c4 2004-04-21 devnull treedump(void)
517 e37302c4 2004-04-21 devnull {
518 e37302c4 2004-04-21 devnull int t;
519 e37302c4 2004-04-21 devnull uchar *p;
520 e37302c4 2004-04-21 devnull print("treedump %d nodes:\n",tptr);
521 e37302c4 2004-04-21 devnull for(t=0;t<tptr;t++){
522 e37302c4 2004-04-21 devnull print("%4d ",t);
523 e37302c4 2004-04-21 devnull parent[t] ? print("p=%4d",parent[t]) : print(" ");
524 e37302c4 2004-04-21 devnull print(" ");
525 e37302c4 2004-04-21 devnull if(name[t] < NCH)
526 e37302c4 2004-04-21 devnull allprint(name[t]);
527 e37302c4 2004-04-21 devnull else switch(name[t]){
528 e37302c4 2004-04-21 devnull case RSTR:
529 e37302c4 2004-04-21 devnull print("%d ",left[t]);
530 e37302c4 2004-04-21 devnull allprint(right[t]);
531 e37302c4 2004-04-21 devnull break;
532 e37302c4 2004-04-21 devnull case RCCL:
533 e37302c4 2004-04-21 devnull print("ccl ");
534 e37302c4 2004-04-21 devnull strpt(left[t]);
535 e37302c4 2004-04-21 devnull break;
536 e37302c4 2004-04-21 devnull case RNCCL:
537 e37302c4 2004-04-21 devnull print("nccl ");
538 e37302c4 2004-04-21 devnull strpt(left[t]);
539 e37302c4 2004-04-21 devnull break;
540 e37302c4 2004-04-21 devnull case DIV:
541 e37302c4 2004-04-21 devnull print("/ %d %d",left[t],right[t]);
542 e37302c4 2004-04-21 devnull break;
543 e37302c4 2004-04-21 devnull case BAR:
544 e37302c4 2004-04-21 devnull print("| %d %d",left[t],right[t]);
545 e37302c4 2004-04-21 devnull break;
546 e37302c4 2004-04-21 devnull case RCAT:
547 e37302c4 2004-04-21 devnull print("cat %d %d",left[t],right[t]);
548 e37302c4 2004-04-21 devnull break;
549 e37302c4 2004-04-21 devnull case PLUS:
550 e37302c4 2004-04-21 devnull print("+ %d",left[t]);
551 e37302c4 2004-04-21 devnull break;
552 e37302c4 2004-04-21 devnull case STAR:
553 e37302c4 2004-04-21 devnull print("* %d",left[t]);
554 e37302c4 2004-04-21 devnull break;
555 e37302c4 2004-04-21 devnull case CARAT:
556 e37302c4 2004-04-21 devnull print("^ %d",left[t]);
557 e37302c4 2004-04-21 devnull break;
558 e37302c4 2004-04-21 devnull case QUEST:
559 e37302c4 2004-04-21 devnull print("? %d",left[t]);
560 e37302c4 2004-04-21 devnull break;
561 e37302c4 2004-04-21 devnull case RNULLS:
562 e37302c4 2004-04-21 devnull print("nullstring");
563 e37302c4 2004-04-21 devnull break;
564 e37302c4 2004-04-21 devnull case FINAL:
565 e37302c4 2004-04-21 devnull print("final %d",left[t]);
566 e37302c4 2004-04-21 devnull break;
567 e37302c4 2004-04-21 devnull case S1FINAL:
568 e37302c4 2004-04-21 devnull print("s1final %d",left[t]);
569 e37302c4 2004-04-21 devnull break;
570 e37302c4 2004-04-21 devnull case S2FINAL:
571 e37302c4 2004-04-21 devnull print("s2final %d",left[t]);
572 e37302c4 2004-04-21 devnull break;
573 e37302c4 2004-04-21 devnull case RNEWE:
574 e37302c4 2004-04-21 devnull print("new %d %d",left[t],right[t]);
575 e37302c4 2004-04-21 devnull break;
576 e37302c4 2004-04-21 devnull case RSCON:
577 e37302c4 2004-04-21 devnull p = (uchar *)right[t];
578 e37302c4 2004-04-21 devnull print("start %s",sname[*p++-1]);
579 e37302c4 2004-04-21 devnull while(*p)
580 e37302c4 2004-04-21 devnull print(", %s",sname[*p++-1]);
581 e37302c4 2004-04-21 devnull print(" %d",left[t]);
582 e37302c4 2004-04-21 devnull break;
583 e37302c4 2004-04-21 devnull default:
584 e37302c4 2004-04-21 devnull print("unknown %d %d %d",name[t],left[t],right[t]);
585 e37302c4 2004-04-21 devnull break;
586 e37302c4 2004-04-21 devnull }
587 e37302c4 2004-04-21 devnull if(nullstr[t])print("\t(null poss.)");
588 e37302c4 2004-04-21 devnull print("\n");
589 e37302c4 2004-04-21 devnull }
590 e37302c4 2004-04-21 devnull }
591 e37302c4 2004-04-21 devnull # endif