|
|
1.1 root 1: # define CHAR 257
2: # define CCL 258
3: # define NCCL 259
4: # define STR 260
5: # define DELIM 261
6: # define SCON 262
7: # define ITER 263
8: # define NEWE 264
9: # define NULLS 265
10: # define CAT 266
11:
12: # line 11 "parser.y"
13: #ifndef lint
14: static char sccsid[] = "@(#)parser.y 4.1 (Berkeley) 8/11/83";
15: #endif
16:
17: # include "ldefs.c"
18: #define yyclearin yychar = -1
19: #define yyerrok yyerrflag = 0
20: extern int yychar;
21: extern short yyerrflag;
22: #ifndef YYMAXDEPTH
23: #define YYMAXDEPTH 150
24: #endif
25: #ifndef YYSTYPE
26: #define YYSTYPE int
27: #endif
28: YYSTYPE yylval, yyval;
29:
30: # line 19 "parser.y"
31: int i;
32: int j,k;
33: int g;
34: char *p;
35: # define YYERRCODE 256
36:
37: # line 215 "parser.y"
38:
39: yylex(){
40: register char *p;
41: register int c, i;
42: char *t, *xp;
43: int n, j, k, x;
44: static int sectbegin;
45: static char token[TOKENSIZE];
46: static int iter;
47:
48: # ifdef DEBUG
49: yylval = 0;
50: # endif
51:
52: if(sect == DEFSECTION) { /* definitions section */
53: while(!eof) {
54: if(prev == '\n'){ /* next char is at beginning of line */
55: getl(p=buf);
56: switch(*p){
57: case '%':
58: switch(c= *(p+1)){
59: case '%':
60: lgate();
61: if(!ratfor)fprintf(fout,"# ");
62: fprintf(fout,"define YYNEWLINE %d\n",ctable['\n']);
63: if(!ratfor)fprintf(fout,"yylex(){\nint nstr; extern int yyprevious;\n");
64: sectbegin = TRUE;
65: i = treesize*(sizeof(*name)+sizeof(*left)+
66: sizeof(*right)+sizeof(*nullstr)+sizeof(*parent))+ALITTLEEXTRA;
67: c = myalloc(i,1);
68: if(c == 0)
69: error("Too little core for parse tree");
70: p = c;
71: cfree(p,i,1);
72: name = myalloc(treesize,sizeof(*name));
73: left = myalloc(treesize,sizeof(*left));
74: right = myalloc(treesize,sizeof(*right));
75: nullstr = myalloc(treesize,sizeof(*nullstr));
76: parent = myalloc(treesize,sizeof(*parent));
77: if(name == 0 || left == 0 || right == 0 || parent == 0 || nullstr == 0)
78: error("Too little core for parse tree");
79: return(freturn(DELIM));
80: case 'p': case 'P': /* has overridden number of positions */
81: while(*p && !digit(*p))p++;
82: maxpos = siconv(p);
83: # ifdef DEBUG
84: if (debug) printf("positions (%%p) now %d\n",maxpos);
85: # endif
86: if(report == 2)report = 1;
87: continue;
88: case 'n': case 'N': /* has overridden number of states */
89: while(*p && !digit(*p))p++;
90: nstates = siconv(p);
91: # ifdef DEBUG
92: if(debug)printf( " no. states (%%n) now %d\n",nstates);
93: # endif
94: if(report == 2)report = 1;
95: continue;
96: case 'e': case 'E': /* has overridden number of tree nodes */
97: while(*p && !digit(*p))p++;
98: treesize = siconv(p);
99: # ifdef DEBUG
100: if (debug) printf("treesize (%%e) now %d\n",treesize);
101: # endif
102: if(report == 2)report = 1;
103: continue;
104: case 'o': case 'O':
105: while (*p && !digit(*p))p++;
106: outsize = siconv(p);
107: if (report ==2) report=1;
108: continue;
109: case 'a': case 'A': /* has overridden number of transitions */
110: while(*p && !digit(*p))p++;
111: if(report == 2)report = 1;
112: ntrans = siconv(p);
113: # ifdef DEBUG
114: if (debug)printf("N. trans (%%a) now %d\n",ntrans);
115: # endif
116: continue;
117: case 'k': case 'K': /* overriden packed char classes */
118: while (*p && !digit(*p))p++;
119: if (report==2) report=1;
120: cfree(pchar, pchlen, sizeof(*pchar));
121: pchlen = siconv(p);
122: # ifdef DEBUG
123: if (debug) printf( "Size classes (%%k) now %d\n",pchlen);
124: # endif
125: pchar=pcptr=myalloc(pchlen, sizeof(*pchar));
126: continue;
127: case 't': case 'T': /* character set specifier */
128: ZCH = atoi(p+2);
129: if (ZCH < NCH) ZCH = NCH;
130: if (ZCH > 2*NCH) error("ch table needs redeclaration");
131: chset = TRUE;
132: for(i = 0; i<ZCH; i++)
133: ctable[i] = 0;
134: while(getl(p) && scomp(p,"%T") != 0 && scomp(p,"%t") != 0){
135: if((n = siconv(p)) <= 0 || n > ZCH){
136: warning("Character value %d out of range",n);
137: continue;
138: }
139: while(!space(*p) && *p) p++;
140: while(space(*p)) p++;
141: t = p;
142: while(*t){
143: c = ctrans(&t);
144: if(ctable[c]){
145: if (printable(c))
146: warning("Character '%c' used twice",c);
147: else
148: warning("Character %o used twice",c);
149: }
150: else ctable[c] = n;
151: t++;
152: }
153: p = buf;
154: }
155: {
156: char chused[2*NCH]; int kr;
157: for(i=0; i<ZCH; i++)
158: chused[i]=0;
159: for(i=0; i<NCH; i++)
160: chused[ctable[i]]=1;
161: for(kr=i=1; i<NCH; i++)
162: if (ctable[i]==0)
163: {
164: while (chused[kr] == 0)
165: kr++;
166: ctable[i]=kr;
167: chused[kr]=1;
168: }
169: }
170: lgate();
171: continue;
172: case 'r': case 'R':
173: c = 'r';
174: case 'c': case 'C':
175: if(lgatflg)
176: error("Too late for language specifier");
177: ratfor = (c == 'r');
178: continue;
179: case '{':
180: lgate();
181: while(getl(p) && scomp(p,"%}") != 0)
182: fprintf(fout, "%s\n",p);
183: if(p[0] == '%') continue;
184: error("Premature eof");
185: case 's': case 'S': /* start conditions */
186: lgate();
187: while(*p && index(*p," \t,") < 0) p++;
188: n = TRUE;
189: while(n){
190: while(*p && index(*p," \t,") >= 0) p++;
191: t = p;
192: while(*p && index(*p," \t,") < 0)p++;
193: if(!*p) n = FALSE;
194: *p++ = 0;
195: if (*t == 0) continue;
196: i = sptr*2;
197: if(!ratfor)fprintf(fout,"# ");
198: fprintf(fout,"define %s %d\n",t,i);
199: scopy(t,sp);
200: sname[sptr++] = sp;
201: sname[sptr] = 0; /* required by lookup */
202: if(sptr >= STARTSIZE)
203: error("Too many start conditions");
204: sp += slength(sp) + 1;
205: if(sp >= schar+STARTCHAR)
206: error("Start conditions too long");
207: }
208: continue;
209: default:
210: warning("Invalid request %s",p);
211: continue;
212: } /* end of switch after seeing '%' */
213: case ' ': case '\t': /* must be code */
214: lgate();
215: fprintf(fout, "%s\n",p);
216: continue;
217: default: /* definition */
218: while(*p && !space(*p)) p++;
219: if(*p == 0)
220: continue;
221: prev = *p;
222: *p = 0;
223: bptr = p+1;
224: yylval = buf;
225: if(digit(buf[0]))
226: warning("Substitution strings may not begin with digits");
227: return(freturn(STR));
228: }
229: }
230: /* still sect 1, but prev != '\n' */
231: else {
232: p = bptr;
233: while(*p && space(*p)) p++;
234: if(*p == 0)
235: warning("No translation given - null string assumed");
236: scopy(p,token);
237: yylval = token;
238: prev = '\n';
239: return(freturn(STR));
240: }
241: }
242: /* end of section one processing */
243: }
244: else if(sect == RULESECTION){ /* rules and actions */
245: while(!eof){
246: switch(c=gch()){
247: case '\0':
248: return(freturn(0));
249: case '\n':
250: if(prev == '\n') continue;
251: x = NEWE;
252: break;
253: case ' ':
254: case '\t':
255: if(sectbegin == TRUE){
256: cpyact();
257: while((c=gch()) && c != '\n');
258: continue;
259: }
260: if(!funcflag)phead2();
261: funcflag = TRUE;
262: if(ratfor)fprintf(fout,"%d\n",30000+casecount);
263: else fprintf(fout,"case %d:\n",casecount);
264: if(cpyact()){
265: if(ratfor)fprintf(fout,"goto 30997\n");
266: else fprintf(fout,"break;\n");
267: }
268: while((c=gch()) && c != '\n');
269: if(peek == ' ' || peek == '\t' || sectbegin == TRUE){
270: warning("Executable statements should occur right after %%");
271: continue;
272: }
273: x = NEWE;
274: break;
275: case '%':
276: if(prev != '\n') goto character;
277: if(peek == '{'){ /* included code */
278: getl(buf);
279: while(!eof && getl(buf) && scomp("%}",buf) != 0)
280: fprintf(fout,"%s\n",buf);
281: continue;
282: }
283: if(peek == '%'){
284: c = gch();
285: c = gch();
286: x = DELIM;
287: break;
288: }
289: goto character;
290: case '|':
291: if(peek == ' ' || peek == '\t' || peek == '\n'){
292: if(ratfor)fprintf(fout,"%d\n",30000+casecount++);
293: else fprintf(fout,"case %d:\n",casecount++);
294: continue;
295: }
296: x = '|';
297: break;
298: case '$':
299: if(peek == '\n' || peek == ' ' || peek == '\t' || peek == '|' || peek == '/'){
300: x = c;
301: break;
302: }
303: goto character;
304: case '^':
305: if(prev != '\n' && scon != TRUE) goto character; /* valid only at line begin */
306: x = c;
307: break;
308: case '?':
309: case '+':
310: case '.':
311: case '*':
312: case '(':
313: case ')':
314: case ',':
315: case '/':
316: x = c;
317: break;
318: case '}':
319: iter = FALSE;
320: x = c;
321: break;
322: case '{': /* either iteration or definition */
323: if(digit(c=gch())){ /* iteration */
324: iter = TRUE;
325: ieval:
326: i = 0;
327: while(digit(c)){
328: token[i++] = c;
329: c = gch();
330: }
331: token[i] = 0;
332: yylval = siconv(token);
333: munput('c',c);
334: x = ITER;
335: break;
336: }
337: else { /* definition */
338: i = 0;
339: while(c && c!='}'){
340: token[i++] = c;
341: c = gch();
342: }
343: token[i] = 0;
344: i = lookup(token,def);
345: if(i < 0)
346: warning("Definition %s not found",token);
347: else
348: munput('s',subs[i]);
349: continue;
350: }
351: case '<': /* start condition ? */
352: if(prev != '\n') /* not at line begin, not start */
353: goto character;
354: t = slptr;
355: do {
356: i = 0;
357: c = gch();
358: while(c != ',' && c && c != '>'){
359: token[i++] = c;
360: c = gch();
361: }
362: token[i] = 0;
363: if(i == 0)
364: goto character;
365: i = lookup(token,sname);
366: if(i < 0) {
367: warning("Undefined start condition %s",token);
368: continue;
369: }
370: *slptr++ = i+1;
371: } while(c && c != '>');
372: *slptr++ = 0;
373: /* check if previous value re-usable */
374: for (xp=slist; xp<t; )
375: {
376: if (strcmp(xp, t)==0)
377: break;
378: while (*xp++);
379: }
380: if (xp<t)
381: {
382: /* re-use previous pointer to string */
383: slptr=t;
384: t=xp;
385: }
386: if(slptr > slist+STARTSIZE) /* note not packed ! */
387: error("Too many start conditions used");
388: yylval = t;
389: x = SCON;
390: break;
391: case '"':
392: i = 0;
393: while((c=gch()) && c != '"' && c != '\n'){
394: if(c == '\\') c = usescape(c=gch());
395: token[i++] = c;
396: if(i > TOKENSIZE){
397: warning("String too long");
398: i = TOKENSIZE-1;
399: break;
400: }
401: }
402: if(c == '\n') {
403: yyline--;
404: warning("Non-terminated string");
405: yyline++;
406: }
407: token[i] = 0;
408: if(i == 0)x = NULLS;
409: else if(i == 1){
410: yylval = token[0];
411: x = CHAR;
412: }
413: else {
414: yylval = token;
415: x = STR;
416: }
417: break;
418: case '[':
419: for(i=1;i<NCH;i++) symbol[i] = 0;
420: x = CCL;
421: if((c = gch()) == '^'){
422: x = NCCL;
423: c = gch();
424: }
425: while(c != ']' && c){
426: if(c == '\\') c = usescape(c=gch());
427: symbol[c] = 1;
428: j = c;
429: if((c=gch()) == '-' && peek != ']'){ /* range specified */
430: c = gch();
431: if(c == '\\') c = usescape(c=gch());
432: k = c;
433: if(j > k) {
434: n = j;
435: j = k;
436: k = n;
437: }
438: if(!(('A' <= j && k <= 'Z') ||
439: ('a' <= j && k <= 'z') ||
440: ('0' <= j && k <= '9')))
441: warning("Non-portable Character Class");
442: for(n=j+1;n<=k;n++)
443: symbol[n] = 1; /* implementation dependent */
444: c = gch();
445: }
446: }
447: /* try to pack ccl's */
448: i = 0;
449: for(j=0;j<NCH;j++)
450: if(symbol[j])token[i++] = j;
451: token[i] = 0;
452: p = ccptr;
453: if(optim){
454: p = ccl;
455: while(p <ccptr && scomp(token,p) != 0)p++;
456: }
457: if(p < ccptr) /* found it */
458: yylval = p;
459: else {
460: yylval = ccptr;
461: scopy(token,ccptr);
462: ccptr += slength(token) + 1;
463: if(ccptr >= ccl+CCLSIZE)
464: error("Too many large character classes");
465: }
466: cclinter(x==CCL);
467: break;
468: case '\\':
469: c = usescape(c=gch());
470: default:
471: character:
472: if(iter){ /* second part of an iteration */
473: iter = FALSE;
474: if('0' <= c && c <= '9')
475: goto ieval;
476: }
477: if(alpha(peek)){
478: i = 0;
479: yylval = token;
480: token[i++] = c;
481: while(alpha(peek))
482: token[i++] = gch();
483: if(peek == '?' || peek == '*' || peek == '+')
484: munput('c',token[--i]);
485: token[i] = 0;
486: if(i == 1){
487: yylval = token[0];
488: x = CHAR;
489: }
490: else x = STR;
491: }
492: else {
493: yylval = c;
494: x = CHAR;
495: }
496: }
497: scon = FALSE;
498: if(x == SCON)scon = TRUE;
499: sectbegin = FALSE;
500: return(freturn(x));
501: }
502: }
503: /* section three */
504: ptail();
505: # ifdef DEBUG
506: if(debug)
507: fprintf(fout,"\n/*this comes from section three - debug */\n");
508: # endif
509: while(getl(buf) && !eof)
510: fprintf(fout,"%s\n",buf);
511: return(freturn(0));
512: }
513: /* end of yylex */
514: # ifdef DEBUG
515: freturn(i)
516: int i; {
517: if(yydebug) {
518: printf("now return ");
519: if(i < NCH) allprint(i);
520: else printf("%d",i);
521: printf(" yylval = ");
522: switch(i){
523: case STR: case CCL: case NCCL:
524: strpt(yylval);
525: break;
526: case CHAR:
527: allprint(yylval);
528: break;
529: default:
530: printf("%d",yylval);
531: break;
532: }
533: putchar('\n');
534: }
535: return(i);
536: }
537: # endif
538: short yyexca[] ={
539: -1, 1,
540: 0, -1,
541: -2, 0,
542: };
543: # define YYNPROD 33
544: # define YYLAST 291
545: short yyact[]={
546:
547: 34, 45, 35, 23, 21, 43, 27, 28, 4, 34,
548: 16, 32, 41, 21, 46, 27, 28, 10, 34, 16,
549: 32, 8, 21, 9, 27, 28, 25, 29, 16, 6,
550: 7, 3, 24, 34, 27, 28, 29, 21, 11, 27,
551: 28, 2, 5, 16, 1, 29, 21, 0, 27, 28,
552: 0, 0, 16, 0, 0, 29, 21, 0, 20, 0,
553: 29, 0, 16, 0, 0, 21, 0, 20, 0, 29,
554: 0, 16, 0, 0, 31, 0, 20, 0, 0, 0,
555: 12, 0, 0, 12, 0, 0, 0, 0, 30, 0,
556: 0, 20, 0, 42, 36, 37, 38, 30, 0, 0,
557: 0, 0, 0, 0, 0, 39, 30, 40, 0, 0,
558: 20, 0, 0, 0, 0, 0, 0, 0, 0, 20,
559: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
560: 0, 0, 0, 0, 0, 0, 0, 0, 0, 44,
561: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
562: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
563: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
564: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
565: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
566: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
567: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
568: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
569: 0, 14, 17, 18, 15, 0, 19, 33, 0, 22,
570: 14, 17, 18, 15, 0, 19, 33, 26, 22, 14,
571: 17, 18, 15, 0, 0, 33, 0, 22, 0, 0,
572: 0, 0, 0, 0, 14, 17, 18, 15, 0, 0,
573: 33, 0, 22, 14, 17, 18, 15, 0, 0, 33,
574: 0, 22, 13, 14, 17, 18, 15, 7, 19, 0,
575: 0, 22, 14, 17, 18, 15, 0, 19, 0, 0,
576: 22 };
577: short yypact[]={
578:
579: -248,-1000,-1000,-231,-1000, 16,-257,-1000, 16,-1000,
580: -1000,-1000, -27,-262,-1000,-1000,-1000,-1000,-1000, 25,
581: 25, 25,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
582: 25, -8, 25, -32,-1000,-1000, -18, 6, -36, -3,
583: -18,-124,-1000,-1000,-111,-1000,-1000 };
584: short yypgo[]={
585:
586: 0, 44, 41, 31, 38, 21, 23, 17, 74 };
587: short yyr1[]={
588:
589: 0, 1, 2, 2, 2, 6, 6, 3, 3, 4,
590: 5, 5, 7, 7, 8, 8, 8, 8, 8, 8,
591: 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
592: 8, 8, 8 };
593: short yyr2[]={
594:
595: 0, 1, 4, 3, 1, 1, 0, 3, 0, 1,
596: 2, 1, 2, 2, 1, 1, 1, 1, 1, 2,
597: 2, 2, 3, 2, 3, 5, 3, 4, 2, 2,
598: 2, 3, 1 };
599: short yychk[]={
600:
601: -1000, -1, -2, -3, 256, -4, 260, 261, -5, -6,
602: -7, -4, -8, 256, 257, 260, 46, 258, 259, 262,
603: 94, 40, 265, 260, -6, -7, 264, 42, 43, 63,
604: 124, -8, 47, 263, 36, 264, -8, -8, -8, -8,
605: -8, 44, 125, 41, 263, 125, 125 };
606: short yydef[]={
607:
608: 8, -2, 1, 0, 4, 6, 0, 9, 6, 3,
609: 11, 5, 0, 0, 14, 15, 16, 17, 18, 0,
610: 0, 0, 32, 7, 2, 10, 12, 19, 20, 21,
611: 0, 23, 0, 0, 30, 13, 28, 29, 0, 22,
612: 24, 0, 26, 31, 0, 27, 25 };
613: #ifndef lint
614: static char yaccpar_sccsid[] = "@(#)yaccpar 4.1 (Berkeley) 2/11/83";
615: #endif not lint
616:
617: #
618: # define YYFLAG -1000
619: # define YYERROR goto yyerrlab
620: # define YYACCEPT return(0)
621: # define YYABORT return(1)
622:
623: /* parser for yacc output */
624:
625: #ifdef YYDEBUG
626: int yydebug = 0; /* 1 for debugging */
627: #endif
628: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
629: int yychar = -1; /* current input token number */
630: int yynerrs = 0; /* number of errors */
631: short yyerrflag = 0; /* error recovery flag */
632:
633: yyparse() {
634:
635: short yys[YYMAXDEPTH];
636: short yyj, yym;
637: register YYSTYPE *yypvt;
638: register short yystate, *yyps, yyn;
639: register YYSTYPE *yypv;
640: register short *yyxi;
641:
642: yystate = 0;
643: yychar = -1;
644: yynerrs = 0;
645: yyerrflag = 0;
646: yyps= &yys[-1];
647: yypv= &yyv[-1];
648:
649: yystack: /* put a state and value onto the stack */
650:
651: #ifdef YYDEBUG
652: if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar );
653: #endif
654: if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
655: *yyps = yystate;
656: ++yypv;
657: *yypv = yyval;
658:
659: yynewstate:
660:
661: yyn = yypact[yystate];
662:
663: if( yyn<= YYFLAG ) goto yydefault; /* simple state */
664:
665: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
666: if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
667:
668: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
669: yychar = -1;
670: yyval = yylval;
671: yystate = yyn;
672: if( yyerrflag > 0 ) --yyerrflag;
673: goto yystack;
674: }
675:
676: yydefault:
677: /* default state action */
678:
679: if( (yyn=yydef[yystate]) == -2 ) {
680: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
681: /* look through exception table */
682:
683: for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
684:
685: while( *(yyxi+=2) >= 0 ){
686: if( *yyxi == yychar ) break;
687: }
688: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
689: }
690:
691: if( yyn == 0 ){ /* error */
692: /* error ... attempt to resume parsing */
693:
694: switch( yyerrflag ){
695:
696: case 0: /* brand new error */
697:
698: yyerror( "syntax error" );
699: yyerrlab:
700: ++yynerrs;
701:
702: case 1:
703: case 2: /* incompletely recovered error ... try again */
704:
705: yyerrflag = 3;
706:
707: /* find a state where "error" is a legal shift action */
708:
709: while ( yyps >= yys ) {
710: yyn = yypact[*yyps] + YYERRCODE;
711: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
712: yystate = yyact[yyn]; /* simulate a shift of "error" */
713: goto yystack;
714: }
715: yyn = yypact[*yyps];
716:
717: /* the current yyps has no shift onn "error", pop stack */
718:
719: #ifdef YYDEBUG
720: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
721: #endif
722: --yyps;
723: --yypv;
724: }
725:
726: /* there is no state on the stack with an error shift ... abort */
727:
728: yyabort:
729: return(1);
730:
731:
732: case 3: /* no shift yet; clobber input char */
733:
734: #ifdef YYDEBUG
735: if( yydebug ) printf( "error recovery discards char %d\n", yychar );
736: #endif
737:
738: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
739: yychar = -1;
740: goto yynewstate; /* try again in the same state */
741:
742: }
743:
744: }
745:
746: /* reduction by production yyn */
747:
748: #ifdef YYDEBUG
749: if( yydebug ) printf("reduce %d\n",yyn);
750: #endif
751: yyps -= yyr2[yyn];
752: yypvt = yypv;
753: yypv -= yyr2[yyn];
754: yyval = yypv[1];
755: yym=yyn;
756: /* consult goto table to find next state */
757: yyn = yyr1[yyn];
758: yyj = yypgo[yyn] + *yyps + 1;
759: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
760: switch(yym){
761:
762: case 1:
763: # line 25 "parser.y"
764: {
765: # ifdef DEBUG
766: if(debug) sect2dump();
767: # endif
768: } break;
769: case 3:
770: # line 33 "parser.y"
771: {
772: if(!funcflag)phead2();
773: funcflag = TRUE;
774: } break;
775: case 4:
776: # line 38 "parser.y"
777: {
778: # ifdef DEBUG
779: if(debug) {
780: sect1dump();
781: sect2dump();
782: }
783: # endif
784: } break;
785: case 7:
786: # line 49 "parser.y"
787: { scopy(yypvt[-1],dp);
788: def[dptr] = dp;
789: dp += slength(yypvt[-1]) + 1;
790: scopy(yypvt[-0],dp);
791: subs[dptr++] = dp;
792: if(dptr >= DEFSIZE)
793: error("Too many definitions");
794: dp += slength(yypvt[-0]) + 1;
795: if(dp >= dchar+DEFCHAR)
796: error("Definitions too long");
797: subs[dptr]=def[dptr]=0; /* for lookup - require ending null */
798: } break;
799: case 9:
800: # line 64 "parser.y"
801: {
802: # ifdef DEBUG
803: if(sect == DEFSECTION && debug) sect1dump();
804: # endif
805: sect++;
806: } break;
807: case 10:
808: # line 72 "parser.y"
809: { yyval = mn2(RNEWE,yypvt[-1],yypvt[-0]);
810: } break;
811: case 11:
812: # line 75 "parser.y"
813: { yyval = yypvt[-0];} break;
814: case 12:
815: # line 78 "parser.y"
816: {
817: if(divflg == TRUE)
818: i = mn1(S1FINAL,casecount);
819: else i = mn1(FINAL,casecount);
820: yyval = mn2(RCAT,yypvt[-1],i);
821: divflg = FALSE;
822: casecount++;
823: } break;
824: case 13:
825: # line 87 "parser.y"
826: {
827: # ifdef DEBUG
828: if(debug) sect2dump();
829: # endif
830: } break;
831: case 14:
832: # line 93 "parser.y"
833: { yyval = mn0(yypvt[-0]); } break;
834: case 15:
835: # line 95 "parser.y"
836: {
837: p = yypvt[-0];
838: i = mn0(*p++);
839: while(*p)
840: i = mn2(RSTR,i,*p++);
841: yyval = i;
842: } break;
843: case 16:
844: # line 103 "parser.y"
845: { symbol['\n'] = 0;
846: if(psave == FALSE){
847: p = ccptr;
848: psave = ccptr;
849: for(i=1;i<'\n';i++){
850: symbol[i] = 1;
851: *ccptr++ = i;
852: }
853: for(i='\n'+1;i<NCH;i++){
854: symbol[i] = 1;
855: *ccptr++ = i;
856: }
857: *ccptr++ = 0;
858: if(ccptr > ccl+CCLSIZE)
859: error("Too many large character classes");
860: }
861: else
862: p = psave;
863: yyval = mn1(RCCL,p);
864: cclinter(1);
865: } break;
866: case 17:
867: # line 125 "parser.y"
868: { yyval = mn1(RCCL,yypvt[-0]); } break;
869: case 18:
870: # line 127 "parser.y"
871: { yyval = mn1(RNCCL,yypvt[-0]); } break;
872: case 19:
873: # line 129 "parser.y"
874: { yyval = mn1(STAR,yypvt[-1]); } break;
875: case 20:
876: # line 131 "parser.y"
877: { yyval = mn1(PLUS,yypvt[-1]); } break;
878: case 21:
879: # line 133 "parser.y"
880: { yyval = mn1(QUEST,yypvt[-1]); } break;
881: case 22:
882: # line 135 "parser.y"
883: { yyval = mn2(BAR,yypvt[-2],yypvt[-0]); } break;
884: case 23:
885: # line 137 "parser.y"
886: { yyval = mn2(RCAT,yypvt[-1],yypvt[-0]); } break;
887: case 24:
888: # line 139 "parser.y"
889: { if(!divflg){
890: j = mn1(S2FINAL,-casecount);
891: i = mn2(RCAT,yypvt[-2],j);
892: yyval = mn2(DIV,i,yypvt[-0]);
893: }
894: else {
895: yyval = mn2(RCAT,yypvt[-2],yypvt[-0]);
896: warning("Extra slash removed");
897: }
898: divflg = TRUE;
899: } break;
900: case 25:
901: # line 151 "parser.y"
902: { if(yypvt[-3] > yypvt[-1]){
903: i = yypvt[-3];
904: yypvt[-3] = yypvt[-1];
905: yypvt[-1] = i;
906: }
907: if(yypvt[-1] <= 0)
908: warning("Iteration range must be positive");
909: else {
910: j = yypvt[-4];
911: for(k = 2; k<=yypvt[-3];k++)
912: j = mn2(RCAT,j,dupl(yypvt[-4]));
913: for(i = yypvt[-3]+1; i<=yypvt[-1]; i++){
914: g = dupl(yypvt[-4]);
915: for(k=2;k<=i;k++)
916: g = mn2(RCAT,g,dupl(yypvt[-4]));
917: j = mn2(BAR,j,g);
918: }
919: yyval = j;
920: }
921: } break;
922: case 26:
923: # line 172 "parser.y"
924: {
925: if(yypvt[-1] < 0)warning("Can't have negative iteration");
926: else if(yypvt[-1] == 0) yyval = mn0(RNULLS);
927: else {
928: j = yypvt[-2];
929: for(k=2;k<=yypvt[-1];k++)
930: j = mn2(RCAT,j,dupl(yypvt[-2]));
931: yyval = j;
932: }
933: } break;
934: case 27:
935: # line 183 "parser.y"
936: {
937: /* from n to infinity */
938: if(yypvt[-2] < 0)warning("Can't have negative iteration");
939: else if(yypvt[-2] == 0) yyval = mn1(STAR,yypvt[-3]);
940: else if(yypvt[-2] == 1)yyval = mn1(PLUS,yypvt[-3]);
941: else { /* >= 2 iterations minimum */
942: j = yypvt[-3];
943: for(k=2;k<yypvt[-2];k++)
944: j = mn2(RCAT,j,dupl(yypvt[-3]));
945: k = mn1(PLUS,dupl(yypvt[-3]));
946: yyval = mn2(RCAT,j,k);
947: }
948: } break;
949: case 28:
950: # line 197 "parser.y"
951: { yyval = mn2(RSCON,yypvt[-0],yypvt[-1]); } break;
952: case 29:
953: # line 199 "parser.y"
954: { yyval = mn1(CARAT,yypvt[-0]); } break;
955: case 30:
956: # line 201 "parser.y"
957: { i = mn0('\n');
958: if(!divflg){
959: j = mn1(S2FINAL,-casecount);
960: k = mn2(RCAT,yypvt[-1],j);
961: yyval = mn2(DIV,k,i);
962: }
963: else yyval = mn2(RCAT,yypvt[-1],i);
964: divflg = TRUE;
965: } break;
966: case 31:
967: # line 211 "parser.y"
968: { yyval = yypvt[-1]; } break;
969: case 32:
970: # line 213 "parser.y"
971: { yyval = mn0(RNULLS); } break;
972: }
973: goto yystack; /* stack new state and value */
974:
975: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.