|
|
1.1 root 1: # define ERROR 257
2:
3: # line 3 "twig.y"
4: #include "common.h"
5: #include "code.h"
6: #include "sym.h"
7: #define UNDEFINED -1
8: #define GIVENUP -2
9:
10: int debug_flag = 0;
11: int Dflag = 0;
12: int tflag = 0;
13: int line_xref_flag = 0;
14: int ntrees = 0;
15: int nerrors = 0;
16: int fatalerrors = 0;
17: int tree_lineno;
18: FILE *outfile;
19: FILE *symfile;
20: Code *epilogue;
21:
22: SymbolEntry ErrorSymbol;
23:
24: # line 23 "twig.y"
25: typedef union {
26: Node *y_nodep;
27: SymbolEntry *y_symp;
28: Code *y_code;
29: int y_int;
30: } YYSTYPE;
31: # define K_NODE 258
32: # define K_LABEL 259
33: # define K_PROLOGUE 260
34: # define K_CONST 261
35: # define K_INSERT 262
36: # define K_COST 263
37: # define K_ACTION 264
38: # define ID 265
39: # define NUMBER 266
40: # define CBLOCK 267
41: #define yyclearin yychar = -1
42: #define yyerrok yyerrflag = 0
43: extern int yychar;
44: extern short yyerrflag;
45: #ifndef YYMAXDEPTH
46: #define YYMAXDEPTH 150
47: #endif
48: YYSTYPE yylval, yyval;
49: # define YYERRCODE 256
50:
51: # line 255 "twig.y"
52:
53:
54: extern char *process_suffix();
55:
56: set_arity(symp, arityp, count)
57: SymbolEntry *symp;
58: int *arityp;
59: int count;
60: {
61: if(*arityp!=GIVENUP) {
62: if (*arityp==UNDEFINED)
63: *arityp = count;
64: else if (*arityp!=count) {
65: sem_error("inconsistent arity for %s", symp->name);
66: *arityp = GIVENUP;
67: }
68: }
69: }
70:
71: is_node(symp)
72: SymbolEntry *symp;
73: { return(symp->attr==A_NODE); }
74:
75: is_label(symp)
76: SymbolEntry *symp;
77: { return(symp->attr==A_LABEL); }
78:
79: CheckIsNodeOrPred (symp)
80: SymbolEntry *symp;
81: {
82: if (symp->attr==A_ERROR)
83: return;
84: if (symp->attr!=A_NODE)
85: sem_error ("non-node identifier %s", symp->name);
86: }
87:
88: CheckIsUndefined(symp)
89: SymbolEntry *symp;
90: {
91: if (symp->attr==A_ERROR)
92: return(0);
93: if (symp->attr!=A_UNDEFINED) {
94: sem_error ("multiple declaration: %s", symp->name);
95: return(0);
96: } else return(1);
97: }
98:
99: CheckIsDefined(symp)
100: SymbolEntry *symp;
101: {
102: if (symp->attr==A_ERROR)
103: return(0);
104: if (symp->attr==A_UNDEFINED) {
105: sem_error ("undefined identifier: %s", symp->name);
106: symp->attr=A_ERROR;
107: return(0);
108: } else return(1);
109: }
110:
111:
112:
113: /*VARARGS*/
114: yyerror(fmt, s1, s2, s3)
115: char *fmt, *s1, *s2, *s3;
116: {
117: fprintf(stderr, "line %d: ", yyline);
118: fprintf(stderr, fmt, s1, s2, s3);
119: if (token_buffer[0]!=0)
120: fprintf(stderr, " at \"%s\"\n", token_buffer);
121: }
122:
123: /*VARARGS*/
124: yyerror2 (fmt, s1, s2, s3)
125: char *fmt, *s1, *s2, *s3;
126: {
127: fprintf(stderr, "line %d: ", yyline);
128: fprintf(stderr, fmt, s1, s2, s3);
129: putchar('\n');
130: }
131:
132: char *cmdnam;
133: char *inFileName;
134: char *outFileName;
135: char prefixFile[100];
136: static char usage[] = "usage: mt [-d] file";
137: #define USAGE error(1, usage)
138: char *prefix_base = PREFIX_BASE;
139: char *suffix = "c1";
140:
141: main(argc, argv)
142: int argc;
143: char **argv;
144: {
145: int i;
146: char *cp;
147:
148: #ifndef PREFIX_BASE
149: error(1,"PREFIX_BASE has not been defined; recompile twig");
150: #endif
151:
152: cmdnam = argv[0];
153: argv++;
154: inFileName = NULL;
155:
156: while(--argc > 0) {
157: if (*argv[0]=='-')
158: switch(argv[0][1]) {
159: /* to see what each of these flags mean...
160: * see common.h */
161: case 'd': {
162: char *cp;
163: for(cp = &argv[0][2]; *cp!='\0'; cp++)
164: switch(*cp) {
165: case 'l': debug_flag |= DB_LEX; break;
166: case 'm': debug_flag |= DB_MACH; break;
167: case 's': debug_flag |= DB_SYM; break;
168: case 't': debug_flag |= DB_TREE; break;
169: case 'M': debug_flag |= DB_MEM; break;
170: }
171: }
172: break;
173: case 'D': Dflag++; break;
174: case 't': tflag++; break;
175: case 'w': suffix = process_suffix(&argv[0][2]); break;
176: case 'l': prefix_base = &argv[0][2]; break;
177: case 'x': line_xref_flag++; break;
178: default:
179: USAGE;
180: }
181: else inFileName = argv[0];
182: argv++;
183: }
184: if(inFileName==NULL)
185: USAGE;
186:
187: if(freopen(inFileName, "r", stdin)==NULL)
188: error(1, "can't open %s", inFileName);
189: if((cp=strrchr(inFileName, '.'))!=NULL && strcmp(cp,".mt")==0) {
190: if ((outfile = fopen("walker.c" , "w"))==NULL)
191: error(1, "can't write %s", outFileName);
192: if ((symfile = fopen("symbols.h", "w"))==NULL)
193: error(1, "can't write %s", outFileName);
194: } else error(1, "input file must have suffix .mt");
195:
196: ErrorSymbol.attr = A_LABEL;
197: TreeInit();
198: SymbolInit();
199: LexInit();
200: yyparse();
201:
202: SymbolDump();
203: if(nerrors == 0) {
204: if(!tflag) {
205: FILE *prefix;
206: char c;
207: sprintf(prefixFile, "%s.%s", prefix_base, suffix);
208: prefix = fopen(prefixFile, "r");
209: assert(prefix!=NULL);
210: if(Dflag)
211: fputs("#define DEBUG 1\n", outfile);
212: if(line_xref_flag)
213: fputs("#define LINE_XREF 1\n", outfile);
214: fprintf(outfile,"# line 1 \"%s\"\n", prefixFile);
215: while((c=getc(prefix))!=EOF) putc(c, outfile);
216: }
217: MachineGen();
218: SymbolGenerateWalkerCode();
219: CodeWrite(outfile, epilogue);
220: CodeFreeBlock(epilogue);
221: }
222:
223: /* cleanup */
224: cleanup(0);
225: }
226:
227: cleanup(retcode)
228: int retcode;
229: {
230: lexCleanup();
231: if(retcode==0) {
232: SymbolFinish();
233: }
234: exit(retcode);
235: }
236:
237: /*VARARGS*/
238: error(rc, fmt, a1, a2, a3)
239: int rc;
240: char *fmt, *a1, *a2, *a3;
241: {
242: fprintf(stderr, "%s: ", cmdnam);
243: fprintf(stderr, fmt, a1, a2, a3);
244: putc ('\n', stderr);
245: if(rc)
246: exit (rc);
247: }
248:
249: /*VARARGS*/
250: sem_error (fmt, a1, a2, a3)
251: char *fmt, *a1, *a2, *a3;
252: {
253: fprintf (stderr, "line %d: ", yyline);
254: sem_error2(fmt, a1, a2, a3);
255: nerrors++;
256: fatalerrors++;
257: }
258:
259: /*VARARGS*/
260: sem_error2(fmt, a1, a2, a3)
261: char *fmt, *a1, *a2, *a3;
262: {
263: fprintf (stderr, fmt, a1, a2, a3);
264: putc('\n', stderr);
265: nerrors++;
266: }
267:
268: char *
269: process_suffix(suf)
270: char *suf;
271: {
272: extern int gen_table2;
273: if(strcmp(suf,"exper")==0) {
274: /* experimental walker */
275: /* expect this to change alot */
276: gen_table2++;
277: }
278: return(suf);
279: }
280: short yyexca[] ={
281: -1, 1,
282: 0, -1,
283: -2, 0,
284: -1, 10,
285: 0, 1,
286: -2, 0,
287: -1, 66,
288: 40, 49,
289: -2, 51,
290: };
291: # define YYNPROD 56
292: # define YYLAST 261
293: short yyact[]={
294:
295: 16, 71, 4, 6, 7, 5, 14, 8, 9, 17,
296: 4, 6, 7, 5, 37, 8, 9, 29, 89, 79,
297: 88, 78, 73, 72, 54, 36, 61, 59, 28, 50,
298: 44, 40, 16, 92, 33, 31, 66, 27, 14, 25,
299: 22, 17, 66, 32, 30, 93, 65, 70, 94, 85,
300: 69, 53, 87, 76, 75, 64, 63, 62, 60, 58,
301: 57, 39, 48, 38, 83, 82, 86, 49, 24, 21,
302: 12, 20, 13, 3, 80, 10, 11, 2, 77, 84,
303: 23, 35, 19, 34, 18, 15, 26, 90, 1, 45,
304: 41, 0, 51, 0, 0, 0, 0, 0, 0, 0,
305: 0, 74, 0, 0, 0, 0, 67, 0, 0, 0,
306: 68, 0, 0, 0, 0, 0, 0, 81, 0, 0,
307: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
308: 0, 0, 0, 91, 0, 0, 0, 0, 0, 0,
309: 0, 96, 0, 0, 0, 0, 0, 0, 0, 0,
310: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
311: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
312: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
313: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
314: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
315: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
316: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
317: 0, 56, 0, 0, 73, 72, 52, 46, 42, 0,
318: 55, 0, 0, 0, 0, 25, 47, 43, 0, 0,
319: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
320: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
321: 95 };
322: short yypact[]={
323:
324: -248,-1000,-256,-1000,-225,-226,-228,-239,-221,-222,
325: -224,-1000,-1000,-1000,-242, 5, 2,-1000, -28, -29,
326: -1000,-1000, 27, -30,-1000, -10, -35,-1000, 1, 0,
327: -240, -1,-241, -2,-1000,-1000, -3, -4,-229,-1000,
328: -1000,-1000,-1000, 27,-1000,-1000,-1000, 27, -11, -41,
329: -1000,-1000,-1000,-243,-1000,-1000,-1000,-1000,-1000, -5,
330: -1000, -6,-1000,-1000,-1000,-246,-1000,-1000, -11,-243,
331: 24, 23,-1000,-1000,-1000,-1000,-1000, -12,-1000,-1000,
332: 26,-1000,-1000,-1000, -7,-247,-223,-1000,-1000,-1000,
333: 4,-1000,-1000,-1000,-229,-1000,-1000 };
334: short yypgo[]={
335:
336: 0, 88, 46, 87, 86, 85, 84, 71, 82, 69,
337: 80, 68, 62, 47, 79, 78, 77, 75, 73, 72,
338: 70, 74 };
339: short yyr1[]={
340:
341: 0, 1, 16, 16, 18, 18, 18, 18, 18, 18,
342: 18, 18, 18, 18, 4, 4, 4, 8, 8, 8,
343: 6, 6, 6, 7, 9, 12, 12, 12, 10, 10,
344: 10, 11, 13, 13, 17, 17, 17, 17, 20, 20,
345: 19, 19, 14, 14, 14, 15, 15, 15, 5, 21,
346: 2, 2, 3, 3, 3, 3 };
347: short yyr2[]={
348:
349: 0, 2, 2, 1, 3, 3, 3, 3, 3, 4,
350: 4, 3, 3, 3, 2, 1, 2, 2, 1, 2,
351: 2, 1, 2, 2, 4, 3, 3, 0, 2, 1,
352: 2, 3, 1, 1, 2, 2, 1, 1, 3, 3,
353: 6, 2, 2, 2, 0, 1, 1, 0, 1, 0,
354: 5, 1, 3, 1, 1, 2 };
355: short yychk[]={
356:
357: -1000, -1, -16, -18, 258, 261, 259, 260, 263, 264,
358: -17, -18, -20, -19, 262, -5, 256, 265, -6, -8,
359: -7, -9, 265, -10, -11, 265, -4, 265, 267, 256,
360: 265, 256, 265, 256, -19, -20, 267, 256, 58, 59,
361: 59, -7, 256, 265, 59, -9, 256, 265, -12, 40,
362: 59, -11, 256, 61, 59, 265, 256, 59, 59, 267,
363: 59, 267, 59, 59, 59, -2, 265, -12, -12, 61,
364: -13, 42, 266, 265, -13, 59, 59, -15, 267, 265,
365: -21, -13, 41, 41, -14, 61, 40, 59, 267, 265,
366: -3, -2, 256, 41, 44, 256, -2 };
367: short yydef[]={
368:
369: 0, -2, 0, 3, 0, 0, 0, 0, 0, 0,
370: -2, 2, 36, 37, 0, 0, 0, 48, 0, 0,
371: 21, 18, 27, 0, 29, 0, 0, 15, 0, 0,
372: 0, 0, 0, 0, 34, 35, 0, 0, 0, 41,
373: 4, 20, 22, 27, 5, 17, 19, 27, 23, 0,
374: 6, 28, 30, 0, 7, 14, 16, 8, 11, 0,
375: 13, 0, 12, 38, 39, 47, -2, 23, 0, 0,
376: 0, 0, 32, 33, 31, 9, 10, 44, 45, 46,
377: 0, 24, 25, 26, 0, 0, 0, 40, 42, 43,
378: 0, 53, 54, 50, 0, 55, 52 };
379: # ifdef YYDEBUG
380: # include "y.debug"
381: # endif
382:
383: # define YYFLAG -1000
384: # define YYERROR goto yyerrlab
385: # define YYACCEPT return(0)
386: # define YYABORT return(1)
387:
388: /* parser for yacc output */
389:
390: #ifdef YYDEBUG
391: int yydebug = 0; /* 1 for debugging */
392: #endif
393: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
394: int yychar = -1; /* current input token number */
395: int yynerrs = 0; /* number of errors */
396: short yyerrflag = 0; /* error recovery flag */
397:
398: yyparse()
399: { short yys[YYMAXDEPTH];
400: int yyj, yym;
401: register YYSTYPE *yypvt;
402: register int yystate, yyn;
403: register short *yyps;
404: register YYSTYPE *yypv;
405: register short *yyxi;
406:
407: yystate = 0;
408: yychar = -1;
409: yynerrs = 0;
410: yyerrflag = 0;
411: yyps= &yys[-1];
412: yypv= &yyv[-1];
413:
414: yystack: /* put a state and value onto the stack */
415: #ifdef YYDEBUG
416: if(yydebug >= 3)
417: if(yychar < 0 || yytoknames[yychar] == 0)
418: printf("char %d in %s", yychar, yystates[yystate]);
419: else
420: printf("%s in %s", yytoknames[yychar], yystates[yystate]);
421: #endif
422: if( ++yyps >= &yys[YYMAXDEPTH] ) {
423: yyerror( "yacc stack overflow" );
424: return(1);
425: }
426: *yyps = yystate;
427: ++yypv;
428: *yypv = yyval;
429: yynewstate:
430: yyn = yypact[yystate];
431: if(yyn <= YYFLAG) goto yydefault; /* simple state */
432: if(yychar<0) {
433: yychar = yylex();
434: #ifdef YYDEBUG
435: if(yydebug >= 2) {
436: if(yychar <= 0)
437: printf("lex EOF\n");
438: else if(yytoknames[yychar])
439: printf("lex %s\n", yytoknames[yychar]);
440: else
441: printf("lex (%c)\n", yychar);
442: }
443: #endif
444: if(yychar < 0)
445: yychar = 0;
446: }
447: if((yyn += yychar) < 0 || yyn >= YYLAST)
448: goto yydefault;
449: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
450: yychar = -1;
451: yyval = yylval;
452: yystate = yyn;
453: if( yyerrflag > 0 ) --yyerrflag;
454: goto yystack;
455: }
456: yydefault:
457: /* default state action */
458: if( (yyn=yydef[yystate]) == -2 ) {
459: if(yychar < 0) {
460: yychar = yylex();
461: #ifdef YYDEBUG
462: if(yydebug >= 2)
463: if(yychar < 0)
464: printf("lex EOF\n");
465: else
466: printf("lex %s\n", yytoknames[yychar]);
467: #endif
468: if(yychar < 0)
469: yychar = 0;
470: }
471: /* look through exception table */
472: for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate);
473: yyxi += 2 ) ; /* VOID */
474: while( *(yyxi+=2) >= 0 ){
475: if( *yyxi == yychar ) break;
476: }
477: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
478: }
479: if( yyn == 0 ){ /* error */
480: /* error ... attempt to resume parsing */
481: switch( yyerrflag ){
482: case 0: /* brand new error */
483: #ifdef YYDEBUG
484: yyerror("syntax error\n%s", yystates[yystate]);
485: if(yytoknames[yychar])
486: yyerror("saw %s\n", yytoknames[yychar]);
487: else if(yychar >= ' ' && yychar < '\177')
488: yyerror("saw `%c'\n", yychar);
489: else if(yychar == 0)
490: yyerror("saw EOF\n");
491: else
492: yyerror("saw char 0%o\n", yychar);
493: #else
494: yyerror( "syntax error" );
495: #endif
496: yyerrlab:
497: ++yynerrs;
498: case 1:
499: case 2: /* incompletely recovered error ... try again */
500: yyerrflag = 3;
501: /* find a state where "error" is a legal shift action */
502: while ( yyps >= yys ) {
503: yyn = yypact[*yyps] + YYERRCODE;
504: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
505: yystate = yyact[yyn]; /* simulate a shift of "error" */
506: goto yystack;
507: }
508: yyn = yypact[*yyps];
509: /* the current yyps has no shift onn "error", pop stack */
510: #ifdef YYDEBUG
511: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
512: #endif
513: --yyps;
514: --yypv;
515: }
516: /* there is no state on the stack with an error shift ... abort */
517: yyabort:
518: return(1);
519: case 3: /* no shift yet; clobber input char */
520: #ifdef YYDEBUG
521: if( yydebug ) {
522: printf("error recovery discards ");
523: if(yytoknames[yychar])
524: printf("%s\n", yytoknames[yychar]);
525: else if(yychar >= ' ' && yychar < '\177')
526: printf("`%c'\n", yychar);
527: else if(yychar == 0)
528: printf("EOF\n");
529: else
530: printf("char 0%o\n", yychar);
531: }
532: #endif
533: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
534: yychar = -1;
535: goto yynewstate; /* try again in the same state */
536: }
537: }
538: /* reduction by production yyn */
539: #ifdef YYDEBUG
540: if(yydebug) { char *s;
541: printf("reduce %d in:\n\t", yyn);
542: for(s = yystates[yystate]; *s; s++) {
543: putchar(*s);
544: if(*s == '\n' && *(s+1))
545: putchar('\t');
546: }
547: }
548: #endif
549: yyps -= yyr2[yyn];
550: yypvt = yypv;
551: yypv -= yyr2[yyn];
552: yyval = yypv[1];
553: yym=yyn;
554: /* consult goto table to find next state */
555: yyn = yyr1[yyn];
556: yyj = yypgo[yyn] + *yyps + 1;
557: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
558: switch(yym){
559:
560: case 1:
561: # line 42 "twig.y"
562:
563: { if (nerrors==0) machine_build(); } break;
564: case 4:
565: # line 48 "twig.y"
566: { SymbolEnterList (yypvt[-1].y_symp, A_NODE); } break;
567: case 5:
568: # line 51 "twig.y"
569: {
570: SymbolEnterList(yypvt[-1].y_symp, A_NODE);
571: SymbolCheckNodeValues();
572: } break;
573: case 6:
574: # line 56 "twig.y"
575: { SymbolEnterList (yypvt[-1].y_symp, A_CONST); } break;
576: case 7:
577: # line 58 "twig.y"
578: { SymbolEnterList (yypvt[-1].y_symp, A_LABEL); } break;
579: case 8:
580: # line 60 "twig.y"
581: { CodeWrite(outfile, yypvt[-1].y_code); CodeFreeBlock(yypvt[-1].y_code); } break;
582: case 9:
583: # line 63 "twig.y"
584: { yypvt[-2].y_symp->sd.ca.code = yypvt[-1].y_code; yypvt[-2].y_symp->sd.ca.assoc = NULL;
585: SymbolEnter (yypvt[-2].y_symp, A_COST); } break;
586: case 10:
587: # line 67 "twig.y"
588: { yypvt[-2].y_symp->sd.ca.code = yypvt[-1].y_code; yypvt[-2].y_symp->sd.ca.assoc = NULL;
589: SymbolEnter (yypvt[-2].y_symp, A_ACTION); } break;
590: case 14:
591: # line 83 "twig.y"
592: {
593: if(CheckIsUndefined(yypvt[-0].y_symp)) {
594: yypvt[-0].y_symp->next = yypvt[-1].y_symp;
595: yyval.y_symp = yypvt[-0].y_symp;
596: } else yyval.y_symp = yypvt[-1].y_symp;
597: } break;
598: case 15:
599: # line 89 "twig.y"
600: { if(CheckIsUndefined(yypvt[-0].y_symp)) yyval.y_symp = yypvt[-0].y_symp; else yyval.y_symp = NULL; } break;
601: case 17:
602: # line 97 "twig.y"
603: {
604: if(yypvt[-0].y_symp->attr==A_ERROR)
605: yyval.y_symp = yypvt[-1].y_symp;
606: else { yypvt[-0].y_symp->next = yypvt[-1].y_symp; yyval.y_symp = yypvt[-0].y_symp; }
607: } break;
608: case 18:
609: # line 102 "twig.y"
610: { yyval.y_symp = yypvt[-0].y_symp->attr==A_ERROR ? NULL : yypvt[-0].y_symp; } break;
611: case 20:
612: # line 106 "twig.y"
613: {
614: if(yypvt[-0].y_symp->attr==A_ERROR) yyval.y_symp = yypvt[-1].y_symp;
615: else { yypvt[-0].y_symp->next = yypvt[-1].y_symp; yyval.y_symp = yypvt[-0].y_symp; }
616: } break;
617: case 21:
618: # line 110 "twig.y"
619: { yyval.y_symp = yypvt[-0].y_symp->attr==A_ERROR ? NULL : yypvt[-0].y_symp; } break;
620: case 23:
621: # line 114 "twig.y"
622: {
623: if (CheckIsUndefined(yypvt[-1].y_symp)) {
624: yypvt[-1].y_symp->sd.arity = yypvt[-0].y_int; yyval.y_symp = yypvt[-1].y_symp;
625: } else yyval.y_symp = &ErrorSymbol;
626: } break;
627: case 24:
628: # line 121 "twig.y"
629: {
630: if(CheckIsUndefined(yypvt[-3].y_symp)) {
631: yypvt[-3].y_symp->unique = yypvt[-0].y_int; yypvt[-3].y_symp->sd.arity = yypvt[-2].y_int;
632: yyval.y_symp = yypvt[-3].y_symp;
633: } else yyval.y_symp = &ErrorSymbol;
634: } break;
635: case 25:
636: # line 129 "twig.y"
637: { yyval.y_int = yypvt[-1].y_int; } break;
638: case 26:
639: # line 130 "twig.y"
640: { yyval.y_int=GIVENUP; } break;
641: case 27:
642: # line 131 "twig.y"
643: { yyval.y_int = UNDEFINED; } break;
644: case 28:
645: # line 134 "twig.y"
646: {
647: if (yypvt[-0].y_symp->attr==A_ERROR) yyval.y_symp = yypvt[-1].y_symp;
648: else { yypvt[-0].y_symp->next = yypvt[-1].y_symp; yyval.y_symp = yypvt[-0].y_symp; }
649: } break;
650: case 29:
651: # line 138 "twig.y"
652: { yyval.y_symp = yypvt[-0].y_symp->attr==A_ERROR ? NULL : yypvt[-0].y_symp; } break;
653: case 31:
654: # line 142 "twig.y"
655: {
656: if(CheckIsUndefined(yypvt[-2].y_symp)) {
657: yypvt[-2].y_symp->sd.cvalue = yypvt[-0].y_int; yyval.y_symp = yypvt[-2].y_symp;
658: } else yyval.y_symp = &ErrorSymbol;
659: } break;
660: case 33:
661: # line 150 "twig.y"
662: {
663: if(!CheckIsDefined(yypvt[-0].y_symp)) yyval.y_int = UNDEFINED;
664: else if(yypvt[-0].y_symp->attr!=A_CONST) {
665: sem_error("non-constant id used");
666: yyval.y_int = -1;
667: } else yyval.y_int = yypvt[-0].y_symp->sd.cvalue;
668: } break;
669: case 38:
670: # line 164 "twig.y"
671: { epilogue = CodeAppend(epilogue, yypvt[-1].y_code); } break;
672: case 40:
673: # line 169 "twig.y"
674: {
675: if (yypvt[-5].y_symp->attr==A_ERROR) {
676: error(0, "\"label: tree\" pair ignored");
677: TreeFree(yypvt[-3].y_nodep);
678: } else {
679: if(nerrors==0)
680: cgotofn(SymbolEnterTreeIntoLabel(yypvt[-5].y_symp,
681: yypvt[-3].y_nodep, yypvt[-2].y_symp, yypvt[-1].y_symp, tree_lineno));
682: if(debug_flag&DB_TREE)
683: TreePrint(yypvt[-3].y_nodep, 1);
684: }
685: } break;
686: case 42:
687: # line 183 "twig.y"
688: { SymbolEntry *sp = SymbolAllocate (SymbolGenUnique());
689: sp->sd.ca.code = yypvt[-0].y_code; sp->sd.ca.assoc = NULL;
690: SymbolEnter(sp, A_ACTION); yyval.y_symp = sp; } break;
691: case 43:
692: # line 186 "twig.y"
693: { if(CheckIsDefined(yypvt[-0].y_symp)) {
694: if (yypvt[-0].y_symp->attr!=A_ACTION) {
695: sem_error ("non action id: %s", yypvt[-0].y_symp->name);
696: yyval.y_symp = &ErrorSymbol;
697: } else yyval.y_symp = yypvt[-0].y_symp;
698: } else yyval.y_symp = &ErrorSymbol; } break;
699: case 44:
700: # line 192 "twig.y"
701: { yyval.y_symp = NULL;} break;
702: case 45:
703: # line 194 "twig.y"
704: { SymbolEntry *sp = SymbolAllocate (SymbolGenUnique());
705: sp->sd.ca.code = yypvt[-0].y_code; sp->sd.ca.assoc = NULL;
706: SymbolEnter (sp, A_COST); yyval.y_symp = sp;
707: } break;
708: case 46:
709: # line 198 "twig.y"
710: { if (CheckIsDefined(yypvt[-0].y_symp)) {
711: if (yypvt[-0].y_symp->attr!=A_COST) {
712: sem_error ("non cost id: %s", yypvt[-0].y_symp->name);
713: yyval.y_symp = &ErrorSymbol;
714: } else yyval.y_symp = yypvt[-0].y_symp;
715: } else yyval.y_symp = &ErrorSymbol; } break;
716: case 47:
717: # line 204 "twig.y"
718: { yyval.y_symp = NULL; } break;
719: case 48:
720: # line 207 "twig.y"
721: {
722: tree_lineno = yyline; /* record line no */
723: if(!CheckIsDefined(yypvt[-0].y_symp))
724: yypvt[-0].y_symp->attr = A_ERROR;
725: else if(!is_label(yypvt[-0].y_symp)) {
726: sem_error("non label id: %s", yypvt[-0].y_symp->name);
727: yypvt[-0].y_symp->attr = A_ERROR;
728: }
729: yyval.y_symp = yypvt[-0].y_symp;
730: } break;
731: case 49:
732: # line 218 "twig.y"
733: {CheckIsNodeOrPred(yypvt[-0].y_symp);} break;
734: case 50:
735: # line 219 "twig.y"
736: {
737: int count;
738: Node *ap;
739: /* check the arity of the node */
740: for(count=0, ap = yypvt[-1].y_nodep; ap!=NULL; ap=ap->siblings) count++;
741: switch(yypvt[-4].y_symp->attr) {
742: case A_NODE:
743: set_arity(yypvt[-4].y_symp, &yypvt[-4].y_symp->sd.arity, count);
744: break;
745: }
746:
747: yyval.y_nodep = TreeBuild (yypvt[-4].y_symp, yypvt[-1].y_nodep);
748: } break;
749: case 51:
750: # line 233 "twig.y"
751: {
752: CheckIsDefined(yypvt[-0].y_symp);
753: switch (yypvt[-0].y_symp->attr) {
754: case A_NODE:
755: set_arity(yypvt[-0].y_symp, &yypvt[-0].y_symp->sd.arity, 0);
756: break;
757: }
758: yyval.y_nodep = TreeBuild (yypvt[-0].y_symp, NULL);
759: } break;
760: case 52:
761: # line 243 "twig.y"
762: {
763: /*
764: * build sibling list in reverse order TreeBuild will
765: * put it right later.
766: */
767: yypvt[-0].y_nodep->siblings = yypvt[-2].y_nodep;
768: yyval.y_nodep = yypvt[-0].y_nodep;
769: } break;
770: case 53:
771: # line 251 "twig.y"
772: { yypvt[-0].y_nodep->siblings = NULL; yyval.y_nodep = yypvt[-0].y_nodep; } break;
773: case 54:
774: # line 252 "twig.y"
775: { yyval.y_nodep = NULL; } break;
776: }
777: goto yystack; /* stack new state and value */
778: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.