|
|
1.1 root 1: # define NAME 2
2: # define STRING 3
3: # define ICON 4
4: # define FCON 5
5: # define PLUS 6
6: # define MINUS 8
7: # define MUL 11
8: # define AND 14
9: # define OR 17
10: # define ER 19
11: # define QUEST 21
12: # define COLON 22
13: # define ANDAND 23
14: # define OROR 24
15: # define ASOP 25
16: # define RELOP 26
17: # define EQUOP 27
18: # define DIVOP 28
19: # define SHIFTOP 29
20: # define INCOP 30
21: # define UNOP 31
22: # define STROP 32
23: # define TYPE 33
24: # define CLASS 34
25: # define STRUCT 35
26: # define RETURN 36
27: # define GOTO 37
28: # define IF 38
29: # define ELSE 39
30: # define SWITCH 40
31: # define BREAK 41
32: # define CONTINUE 42
33: # define WHILE 43
34: # define DO 44
35: # define FOR 45
36: # define DEFAULT 46
37: # define CASE 47
38: # define SIZEOF 48
39: # define ENUM 49
40: # define LP 50
41: # define RP 51
42: # define LC 52
43: # define RC 53
44: # define LB 54
45: # define RB 55
46: # define CM 56
47: # define SM 57
48: # define ASSIGN 58
49: # define ASM 59
50:
51: # line 109 "../fmip/cgram.y"
52: # include "mfile1"
53: #define yyclearin yychar = -1
54: #define yyerrok yyerrflag = 0
55: extern int yychar;
56: extern short yyerrflag;
57: #ifndef YYMAXDEPTH
58: #define YYMAXDEPTH 150
59: #endif
60: YYSTYPE yylval, yyval;
61:
62: # line 128 "../fmip/cgram.y"
63: static int fake = 0;
64: #ifndef FLEXNAMES
65: static char fakename[NCHNAM+1];
66: #else
67: static char fakename[24];
68: #endif
69: # define YYERRCODE 256
70:
71: # line 852 "../fmip/cgram.y"
72:
73:
74: NODE *
75: mkty( t, d, s ) unsigned t; {
76: return( block( TYPE, NIL, NIL, t, d, s ) );
77: }
78:
79: NODE *
80: bdty( op, p, v ) NODE *p; {
81: register NODE *q;
82:
83: q = block( op, p, NIL, INT, 0, INT );
84:
85: switch( op ){
86:
87: case UNARY MUL:
88: case UNARY CALL:
89: break;
90:
91: case LB:
92: q->in.right = bcon(v);
93: break;
94:
95: case NAME:
96: q->tn.rval = v;
97: break;
98:
99: default:
100: cerror( "bad bdty" );
101: }
102:
103: return( q );
104: }
105:
106: dstash( n ){ /* put n into the dimension table */
107: if( curdim >= DIMTABSZ-1 ){
108: cerror( "dimension table overflow");
109: }
110: dimtab[ curdim++ ] = n;
111: }
112:
113: savebc() {
114: if( psavbc > & asavbc[BCSZ-4 ] ){
115: cerror( "whiles, fors, etc. too deeply nested");
116: }
117: *psavbc++ = brklab;
118: *psavbc++ = contlab;
119: *psavbc++ = flostat;
120: *psavbc++ = swx;
121: flostat = 0;
122: }
123:
124: resetbc(mask){
125:
126: swx = *--psavbc;
127: flostat = *--psavbc | (flostat&mask);
128: contlab = *--psavbc;
129: brklab = *--psavbc;
130:
131: }
132:
133: addcase(p) NODE *p; { /* add case to switch */
134:
135: p = optim( p ); /* change enum to ints */
136: if( p->in.op != ICON ){
137: uerror( "non-constant case expression");
138: return;
139: }
140: if( swp == swtab ){
141: uerror( "case not in switch");
142: return;
143: }
144: if( swp >= &swtab[SWITSZ] ){
145: cerror( "switch table overflow");
146: }
147: swp->sval = p->tn.lval;
148: deflab( swp->slab = getlab() );
149: ++swp;
150: tfree(p);
151: }
152:
153: adddef(){ /* add default case to switch */
154: if( swtab[swx].slab >= 0 ){
155: uerror( "duplicate default in switch");
156: return;
157: }
158: if( swp == swtab ){
159: uerror( "default not inside switch");
160: return;
161: }
162: deflab( swtab[swx].slab = getlab() );
163: }
164:
165: swstart(){
166: /* begin a switch block */
167: if( swp >= &swtab[SWITSZ] ){
168: cerror( "switch table overflow");
169: }
170: swx = swp - swtab;
171: swp->slab = -1;
172: ++swp;
173: }
174:
175: swend(){ /* end a switch block */
176:
177: register struct sw *swbeg, *p, *q, *r, *r1;
178: CONSZ temp;
179: int tempi;
180:
181: swbeg = &swtab[swx+1];
182:
183: /* sort */
184:
185: r1 = swbeg;
186: r = swp-1;
187:
188: while( swbeg < r ){
189: /* bubble largest to end */
190: for( q=swbeg; q<r; ++q ){
191: if( q->sval > (q+1)->sval ){
192: /* swap */
193: r1 = q+1;
194: temp = q->sval;
195: q->sval = r1->sval;
196: r1->sval = temp;
197: tempi = q->slab;
198: q->slab = r1->slab;
199: r1->slab = tempi;
200: }
201: }
202: r = r1;
203: r1 = swbeg;
204: }
205:
206: /* it is now sorted */
207:
208: for( p = swbeg+1; p<swp; ++p ){
209: if( p->sval == (p-1)->sval ){
210: uerror( "duplicate case in switch, %d", tempi=p->sval );
211: return;
212: }
213: }
214:
215: genswitch( swbeg-1, swp-swbeg );
216: swp = swbeg-1;
217: }
218: extern short yyexca[];
219: # define YYNPROD 189
220: # define YYLAST 1249
221: extern short yyact[];
222: extern short yypact[];
223: extern short yypgo[];
224: extern short yyr1[];
225: extern short yyr2[];
226: extern short yychk[];
227: extern short yydef[];
228: #ifndef lint
229: static char yaccpar_sccsid[] = "@(#)yaccpar 4.1 (Berkeley) 2/11/83";
230: #endif not lint
231:
232: #
233: # define YYFLAG -1000
234: # define YYERROR goto yyerrlab
235: # define YYACCEPT return(0)
236: # define YYABORT return(1)
237:
238: /* parser for yacc output */
239:
240: #ifdef YYDEBUG
241: int yydebug = 0; /* 1 for debugging */
242: #endif
243: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
244: int yychar = -1; /* current input token number */
245: int yynerrs = 0; /* number of errors */
246: short yyerrflag = 0; /* error recovery flag */
247:
248: yyparse() {
249:
250: short yys[YYMAXDEPTH];
251: short yyj, yym;
252: register YYSTYPE *yypvt;
253: register short yystate, *yyps, yyn;
254: register YYSTYPE *yypv;
255: register short *yyxi;
256:
257: yystate = 0;
258: yychar = -1;
259: yynerrs = 0;
260: yyerrflag = 0;
261: yyps= &yys[-1];
262: yypv= &yyv[-1];
263:
264: yystack: /* put a state and value onto the stack */
265:
266: #ifdef YYDEBUG
267: if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar );
268: #endif
269: if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
270: *yyps = yystate;
271: ++yypv;
272: *yypv = yyval;
273:
274: yynewstate:
275:
276: yyn = yypact[yystate];
277:
278: if( yyn<= YYFLAG ) goto yydefault; /* simple state */
279:
280: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
281: if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
282:
283: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
284: yychar = -1;
285: yyval = yylval;
286: yystate = yyn;
287: if( yyerrflag > 0 ) --yyerrflag;
288: goto yystack;
289: }
290:
291: yydefault:
292: /* default state action */
293:
294: if( (yyn=yydef[yystate]) == -2 ) {
295: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
296: /* look through exception table */
297:
298: for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
299:
300: while( *(yyxi+=2) >= 0 ){
301: if( *yyxi == yychar ) break;
302: }
303: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
304: }
305:
306: if( yyn == 0 ){ /* error */
307: /* error ... attempt to resume parsing */
308:
309: switch( yyerrflag ){
310:
311: case 0: /* brand new error */
312:
313: yyerror( "syntax error" );
314: yyerrlab:
315: ++yynerrs;
316:
317: case 1:
318: case 2: /* incompletely recovered error ... try again */
319:
320: yyerrflag = 3;
321:
322: /* find a state where "error" is a legal shift action */
323:
324: while ( yyps >= yys ) {
325: yyn = yypact[*yyps] + YYERRCODE;
326: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
327: yystate = yyact[yyn]; /* simulate a shift of "error" */
328: goto yystack;
329: }
330: yyn = yypact[*yyps];
331:
332: /* the current yyps has no shift onn "error", pop stack */
333:
334: #ifdef YYDEBUG
335: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
336: #endif
337: --yyps;
338: --yypv;
339: }
340:
341: /* there is no state on the stack with an error shift ... abort */
342:
343: yyabort:
344: return(1);
345:
346:
347: case 3: /* no shift yet; clobber input char */
348:
349: #ifdef YYDEBUG
350: if( yydebug ) printf( "error recovery discards char %d\n", yychar );
351: #endif
352:
353: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
354: yychar = -1;
355: goto yynewstate; /* try again in the same state */
356:
357: }
358:
359: }
360:
361: /* reduction by production yyn */
362:
363: #ifdef YYDEBUG
364: if( yydebug ) printf("reduce %d\n",yyn);
365: #endif
366: yyps -= yyr2[yyn];
367: yypvt = yypv;
368: yypv -= yyr2[yyn];
369: yyval = yypv[1];
370: yym=yyn;
371: /* consult goto table to find next state */
372: yyn = yyr1[yyn];
373: yyj = yypgo[yyn] + *yyps + 1;
374: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
375: switch(yym){
376:
377: case 2:
378: # line 138 "../fmip/cgram.y"
379: { beg_file(); /* do implementation dep. stuff now */
380: ftnend(); } break;
381: case 3:
382: # line 142 "../fmip/cgram.y"
383: { curclass = SNULL; blevel = 0; } break;
384: case 4:
385: # line 144 "../fmip/cgram.y"
386: {
387: asmout();
388: curclass = SNULL;
389: blevel = 0;
390: } break;
391: case 5:
392: # line 150 "../fmip/cgram.y"
393: { curclass = SNULL; blevel = 0; } break;
394: case 6:
395: # line 154 "../fmip/cgram.y"
396: { yypvt[-1].nodep->in.op = FREE; } break;
397: case 7:
398: # line 156 "../fmip/cgram.y"
399: { yypvt[-2].nodep->in.op = FREE; } break;
400: case 8:
401: # line 157 "../fmip/cgram.y"
402: {
403: defid( tymerge(yypvt[-1].nodep,yypvt[-0].nodep), curclass==STATIC?STATIC:EXTDEF );
404: #ifndef LINT
405: pfstab(stab[yypvt[-0].nodep->tn.rval].sname);
406: #endif
407: } break;
408: case 9:
409: # line 163 "../fmip/cgram.y"
410: {
411: if( blevel ) cerror( "function level error" );
412: if( reached ) retstat |= NRETVAL;
413: yypvt[-3].nodep->in.op = FREE;
414: ftnend();
415: } break;
416: case 12:
417: # line 174 "../fmip/cgram.y"
418: { blevel = 1; } break;
419: case 14:
420: # line 179 "../fmip/cgram.y"
421: { bccode();
422: locctr(PROG);
423: } break;
424: case 15:
425: # line 185 "../fmip/cgram.y"
426: { yypvt[-1].nodep->in.op = FREE;
427: #ifndef LINT
428: plcstab(blevel);
429: #endif
430: } break;
431: case 16:
432: # line 191 "../fmip/cgram.y"
433: { yypvt[-2].nodep->in.op = FREE;
434: #ifndef LINT
435: plcstab(blevel);
436: #endif
437: } break;
438: case 17:
439: # line 199 "../fmip/cgram.y"
440: { yypvt[-1].nodep->in.op = FREE; } break;
441: case 18:
442: # line 201 "../fmip/cgram.y"
443: { yypvt[-2].nodep->in.op = FREE; } break;
444: case 20:
445: # line 205 "../fmip/cgram.y"
446: { curclass = SNULL; yypvt[-2].nodep->in.op = FREE; } break;
447: case 21:
448: # line 207 "../fmip/cgram.y"
449: { curclass = SNULL; yypvt[-1].nodep->in.op = FREE; } break;
450: case 22:
451: # line 209 "../fmip/cgram.y"
452: { curclass = SNULL; } break;
453: case 24:
454: # line 213 "../fmip/cgram.y"
455: { yyval.nodep = mkty(INT,0,INT); curclass = SNULL; } break;
456: case 25:
457: # line 216 "../fmip/cgram.y"
458: { yyval.nodep = yypvt[-0].nodep; } break;
459: case 27:
460: # line 219 "../fmip/cgram.y"
461: { yyval.nodep = mkty(INT,0,INT); } break;
462: case 28:
463: # line 221 "../fmip/cgram.y"
464: { curclass = SNULL ; } break;
465: case 29:
466: # line 223 "../fmip/cgram.y"
467: { yypvt[-2].nodep->in.type = types( yypvt[-2].nodep->in.type, yypvt[-0].nodep->in.type, UNDEF );
468: yypvt[-0].nodep->in.op = FREE;
469: } break;
470: case 30:
471: # line 230 "../fmip/cgram.y"
472: { curclass = yypvt[-0].intval; } break;
473: case 32:
474: # line 235 "../fmip/cgram.y"
475: { yypvt[-1].nodep->in.type = types( yypvt[-1].nodep->in.type, yypvt[-0].nodep->in.type, UNDEF );
476: yypvt[-0].nodep->in.op = FREE;
477: } break;
478: case 33:
479: # line 239 "../fmip/cgram.y"
480: { yypvt[-2].nodep->in.type = types( yypvt[-2].nodep->in.type, yypvt[-1].nodep->in.type, yypvt[-0].nodep->in.type );
481: yypvt[-1].nodep->in.op = yypvt[-0].nodep->in.op = FREE;
482: } break;
483: case 36:
484: # line 247 "../fmip/cgram.y"
485: { yyval.nodep = dclstruct(yypvt[-4].intval); } break;
486: case 37:
487: # line 249 "../fmip/cgram.y"
488: { yyval.nodep = rstruct(yypvt[-0].intval,0); stwart = instruct; } break;
489: case 38:
490: # line 253 "../fmip/cgram.y"
491: { yyval.intval = bstruct(-1,0); stwart = SEENAME; } break;
492: case 39:
493: # line 255 "../fmip/cgram.y"
494: { yyval.intval = bstruct(yypvt[-0].intval,0); stwart = SEENAME; } break;
495: case 42:
496: # line 263 "../fmip/cgram.y"
497: { moedef( yypvt[-0].intval ); } break;
498: case 43:
499: # line 265 "../fmip/cgram.y"
500: { strucoff = yypvt[-0].intval; moedef( yypvt[-2].intval ); } break;
501: case 44:
502: # line 269 "../fmip/cgram.y"
503: { yyval.nodep = dclstruct(yypvt[-4].intval); } break;
504: case 45:
505: # line 271 "../fmip/cgram.y"
506: { yyval.nodep = rstruct(yypvt[-0].intval,yypvt[-1].intval); } break;
507: case 46:
508: # line 275 "../fmip/cgram.y"
509: { yyval.intval = bstruct(-1,yypvt[-0].intval); stwart=0; } break;
510: case 47:
511: # line 277 "../fmip/cgram.y"
512: { yyval.intval = bstruct(yypvt[-0].intval,yypvt[-1].intval); stwart=0; } break;
513: case 50:
514: # line 285 "../fmip/cgram.y"
515: { curclass = SNULL; stwart=0; yypvt[-1].nodep->in.op = FREE; } break;
516: case 51:
517: # line 287 "../fmip/cgram.y"
518: { if( curclass != MOU ){
519: curclass = SNULL;
520: }
521: else {
522: sprintf( fakename, "$%dFAKE", fake++ );
523: #ifdef FLEXSTRINGS
524: /* No need to hash this, we won't look it up */
525: defid( tymerge(yypvt[-0].nodep, bdty(NAME,NIL,lookup( savestr(fakename), SMOS ))), curclass );
526: #else
527: defid( tymerge(yypvt[-0].nodep, bdty(NAME,NIL,lookup( fakename, SMOS ))), curclass );
528: #endif
529: werror("structure typed union member must be named");
530: }
531: stwart = 0;
532: yypvt[-0].nodep->in.op = FREE;
533: } break;
534: case 52:
535: # line 307 "../fmip/cgram.y"
536: { defid( tymerge(yypvt[-1].nodep,yypvt[-0].nodep), curclass); stwart = instruct; } break;
537: case 53:
538: # line 308 "../fmip/cgram.y"
539: {yyval.nodep=yypvt[-2].nodep;} break;
540: case 54:
541: # line 309 "../fmip/cgram.y"
542: { defid( tymerge(yypvt[-4].nodep,yypvt[-0].nodep), curclass); stwart = instruct; } break;
543: case 57:
544: # line 315 "../fmip/cgram.y"
545: { if( !(instruct&INSTRUCT) ) uerror( "field outside of structure" );
546: if( yypvt[-0].intval<0 || yypvt[-0].intval >= FIELD ){
547: uerror( "illegal field size" );
548: yypvt[-0].intval = 1;
549: }
550: defid( tymerge(yypvt[-3].nodep,yypvt[-2].nodep), FIELD|yypvt[-0].intval );
551: yyval.nodep = NIL;
552: } break;
553: case 58:
554: # line 325 "../fmip/cgram.y"
555: { if( !(instruct&INSTRUCT) ) uerror( "field outside of structure" );
556: falloc( stab, yypvt[-0].intval, -1, yypvt[-2].nodep ); /* alignment or hole */
557: yyval.nodep = NIL;
558: } break;
559: case 59:
560: # line 330 "../fmip/cgram.y"
561: { yyval.nodep = NIL; } break;
562: case 60:
563: # line 335 "../fmip/cgram.y"
564: { umul:
565: yyval.nodep = bdty( UNARY MUL, yypvt[-0].nodep, 0 ); } break;
566: case 61:
567: # line 338 "../fmip/cgram.y"
568: { uftn:
569: yyval.nodep = bdty( UNARY CALL, yypvt[-2].nodep, 0 ); } break;
570: case 62:
571: # line 341 "../fmip/cgram.y"
572: { uary:
573: yyval.nodep = bdty( LB, yypvt[-2].nodep, 0 ); } break;
574: case 63:
575: # line 344 "../fmip/cgram.y"
576: { bary:
577: if( (int)yypvt[-1].intval <= 0 ) werror( "zero or negative subscript" );
578: yyval.nodep = bdty( LB, yypvt[-3].nodep, yypvt[-1].intval ); } break;
579: case 64:
580: # line 348 "../fmip/cgram.y"
581: { yyval.nodep = bdty( NAME, NIL, yypvt[-0].intval ); } break;
582: case 65:
583: # line 350 "../fmip/cgram.y"
584: { yyval.nodep=yypvt[-1].nodep; } break;
585: case 66:
586: # line 353 "../fmip/cgram.y"
587: { goto umul; } break;
588: case 67:
589: # line 355 "../fmip/cgram.y"
590: { goto uftn; } break;
591: case 68:
592: # line 357 "../fmip/cgram.y"
593: { goto uary; } break;
594: case 69:
595: # line 359 "../fmip/cgram.y"
596: { goto bary; } break;
597: case 70:
598: # line 361 "../fmip/cgram.y"
599: { yyval.nodep = yypvt[-1].nodep; } break;
600: case 71:
601: # line 363 "../fmip/cgram.y"
602: {
603: if( blevel!=0 ) uerror("function declaration in bad context");
604: yyval.nodep = bdty( UNARY CALL, bdty(NAME,NIL,yypvt[-2].intval), 0 );
605: stwart = 0;
606: } break;
607: case 72:
608: # line 369 "../fmip/cgram.y"
609: {
610: yyval.nodep = bdty( UNARY CALL, bdty(NAME,NIL,yypvt[-1].intval), 0 );
611: stwart = 0;
612: } break;
613: case 73:
614: # line 376 "../fmip/cgram.y"
615: {
616: /* turn off typedefs for argument names */
617: stwart = SEENAME;
618: if( stab[yypvt[-1].intval].sclass == SNULL )
619: stab[yypvt[-1].intval].stype = FTN;
620: } break;
621: case 74:
622: # line 385 "../fmip/cgram.y"
623: { ftnarg( yypvt[-0].intval ); stwart = SEENAME; } break;
624: case 75:
625: # line 387 "../fmip/cgram.y"
626: { ftnarg( yypvt[-0].intval ); stwart = SEENAME; } break;
627: case 78:
628: # line 393 "../fmip/cgram.y"
629: {yyval.nodep=yypvt[-2].nodep;} break;
630: case 80:
631: # line 397 "../fmip/cgram.y"
632: { defid( yypvt[-0].nodep = tymerge(yypvt[-1].nodep,yypvt[-0].nodep), curclass);
633: beginit(yypvt[-0].nodep->tn.rval);
634: } break;
635: case 82:
636: # line 404 "../fmip/cgram.y"
637: { nidcl( tymerge(yypvt[-1].nodep,yypvt[-0].nodep) ); } break;
638: case 83:
639: # line 406 "../fmip/cgram.y"
640: { defid( tymerge(yypvt[-1].nodep,yypvt[-0].nodep), uclass(curclass) );
641: } break;
642: case 84:
643: # line 410 "../fmip/cgram.y"
644: { doinit( yypvt[-0].nodep );
645: endinit(); } break;
646: case 85:
647: # line 413 "../fmip/cgram.y"
648: { endinit(); } break;
649: case 89:
650: # line 423 "../fmip/cgram.y"
651: { doinit( yypvt[-0].nodep ); } break;
652: case 90:
653: # line 425 "../fmip/cgram.y"
654: { irbrace(); } break;
655: case 95:
656: # line 437 "../fmip/cgram.y"
657: { werror( "old-fashioned initialization: use =" ); } break;
658: case 97:
659: # line 442 "../fmip/cgram.y"
660: { ilbrace(); } break;
661: case 100:
662: # line 452 "../fmip/cgram.y"
663: {
664: #ifndef LINT
665: prcstab(blevel);
666: #endif
667: --blevel;
668: if( blevel == 1 ) blevel = 0;
669: clearst( blevel );
670: checkst( blevel );
671: autooff = *--psavbc;
672: regvar = *--psavbc;
673: } break;
674: case 101:
675: # line 466 "../fmip/cgram.y"
676: { --blevel;
677: if( blevel == 1 ) blevel = 0;
678: clearst( blevel );
679: checkst( blevel );
680: autooff = *--psavbc;
681: regvar = *--psavbc;
682: } break;
683: case 102:
684: # line 476 "../fmip/cgram.y"
685: { if( blevel == 1 ) dclargs();
686: ++blevel;
687: if( psavbc > &asavbc[BCSZ-2] ) cerror( "nesting too deep" );
688: *psavbc++ = regvar;
689: *psavbc++ = autooff;
690: } break;
691: case 103:
692: # line 485 "../fmip/cgram.y"
693: { ecomp( yypvt[-1].nodep ); } break;
694: case 104:
695: # line 487 "../fmip/cgram.y"
696: {
697: asmout();
698: } break;
699: case 106:
700: # line 492 "../fmip/cgram.y"
701: { deflab(yypvt[-1].intval);
702: reached = 1;
703: } break;
704: case 107:
705: # line 496 "../fmip/cgram.y"
706: { if( yypvt[-1].intval != NOLAB ){
707: deflab( yypvt[-1].intval );
708: reached = 1;
709: }
710: } break;
711: case 108:
712: # line 502 "../fmip/cgram.y"
713: { branch( contlab );
714: deflab( brklab );
715: if( (flostat&FBRK) || !(flostat&FLOOP)) reached = 1;
716: else reached = 0;
717: resetbc(0);
718: } break;
719: case 109:
720: # line 509 "../fmip/cgram.y"
721: { deflab( contlab );
722: if( flostat & FCONT ) reached = 1;
723: ecomp( buildtree( CBRANCH, buildtree( NOT, yypvt[-2].nodep, NIL ), bcon( yypvt[-6].intval ) ) );
724: deflab( brklab );
725: reached = 1;
726: resetbc(0);
727: } break;
728: case 110:
729: # line 517 "../fmip/cgram.y"
730: { deflab( contlab );
731: if( flostat&FCONT ) reached = 1;
732: if( yypvt[-2].nodep ) ecomp( yypvt[-2].nodep );
733: branch( yypvt[-3].intval );
734: deflab( brklab );
735: if( (flostat&FBRK) || !(flostat&FLOOP) ) reached = 1;
736: else reached = 0;
737: resetbc(0);
738: } break;
739: case 111:
740: # line 527 "../fmip/cgram.y"
741: { if( reached ) branch( brklab );
742: deflab( yypvt[-1].intval );
743: swend();
744: deflab(brklab);
745: if( (flostat&FBRK) || !(flostat&FDEF) ) reached = 1;
746: resetbc(FCONT);
747: } break;
748: case 112:
749: # line 535 "../fmip/cgram.y"
750: { if( brklab == NOLAB ) uerror( "illegal break");
751: else if(reached) branch( brklab );
752: flostat |= FBRK;
753: if( brkflag ) goto rch;
754: reached = 0;
755: } break;
756: case 113:
757: # line 542 "../fmip/cgram.y"
758: { if( contlab == NOLAB ) uerror( "illegal continue");
759: else branch( contlab );
760: flostat |= FCONT;
761: goto rch;
762: } break;
763: case 114:
764: # line 548 "../fmip/cgram.y"
765: { retstat |= NRETVAL;
766: branch( retlab );
767: rch:
768: if( !reached ) werror( "statement not reached");
769: reached = 0;
770: } break;
771: case 115:
772: # line 555 "../fmip/cgram.y"
773: { register NODE *temp;
774: idname = curftn;
775: temp = buildtree( NAME, NIL, NIL );
776: if(temp->in.type == TVOID)
777: uerror("void function %s cannot return value",
778: stab[idname].sname);
779: temp->in.type = DECREF( temp->in.type );
780: temp = buildtree( RETURN, temp, yypvt[-1].nodep );
781: /* now, we have the type of the RHS correct */
782: temp->in.left->in.op = FREE;
783: temp->in.op = FREE;
784: ecomp( buildtree( FORCE, temp->in.right, NIL ) );
785: retstat |= RETVAL;
786: branch( retlab );
787: reached = 0;
788: } break;
789: case 116:
790: # line 572 "../fmip/cgram.y"
791: { register NODE *q;
792: q = block( FREE, NIL, NIL, INT|ARY, 0, INT );
793: q->tn.rval = idname = yypvt[-1].intval;
794: defid( q, ULABEL );
795: stab[idname].suse = -lineno;
796: branch( stab[idname].offset );
797: goto rch;
798: } break;
799: case 121:
800: # line 586 "../fmip/cgram.y"
801: { register NODE *q;
802: q = block( FREE, NIL, NIL, INT|ARY, 0, LABEL );
803: q->tn.rval = yypvt[-1].intval;
804: defid( q, LABEL );
805: reached = 1;
806: } break;
807: case 122:
808: # line 593 "../fmip/cgram.y"
809: { addcase(yypvt[-1].nodep);
810: reached = 1;
811: } break;
812: case 123:
813: # line 597 "../fmip/cgram.y"
814: { reached = 1;
815: adddef();
816: flostat |= FDEF;
817: } break;
818: case 124:
819: # line 603 "../fmip/cgram.y"
820: { savebc();
821: if( !reached ) werror( "loop not entered at top");
822: brklab = getlab();
823: contlab = getlab();
824: deflab( yyval.intval = getlab() );
825: reached = 1;
826: } break;
827: case 125:
828: # line 612 "../fmip/cgram.y"
829: { ecomp( buildtree( CBRANCH, yypvt[-1].nodep, bcon( yyval.intval=getlab()) ) ) ;
830: reached = 1;
831: } break;
832: case 126:
833: # line 617 "../fmip/cgram.y"
834: { if( reached ) branch( yyval.intval = getlab() );
835: else yyval.intval = NOLAB;
836: deflab( yypvt[-2].intval );
837: reached = 1;
838: } break;
839: case 127:
840: # line 625 "../fmip/cgram.y"
841: { savebc();
842: if( !reached ) werror( "loop not entered at top");
843: if( yypvt[-1].nodep->in.op == ICON && yypvt[-1].nodep->tn.lval != 0 ) flostat = FLOOP;
844: deflab( contlab = getlab() );
845: reached = 1;
846: brklab = getlab();
847: if( flostat == FLOOP ) tfree( yypvt[-1].nodep );
848: else ecomp( buildtree( CBRANCH, yypvt[-1].nodep, bcon( brklab) ) );
849: } break;
850: case 128:
851: # line 636 "../fmip/cgram.y"
852: { if( yypvt[-3].nodep ) ecomp( yypvt[-3].nodep );
853: else if( !reached ) werror( "loop not entered at top");
854: savebc();
855: contlab = getlab();
856: brklab = getlab();
857: deflab( yyval.intval = getlab() );
858: reached = 1;
859: if( yypvt[-1].nodep ) ecomp( buildtree( CBRANCH, yypvt[-1].nodep, bcon( brklab) ) );
860: else flostat |= FLOOP;
861: } break;
862: case 129:
863: # line 648 "../fmip/cgram.y"
864: { savebc();
865: brklab = getlab();
866: ecomp( buildtree( FORCE, yypvt[-1].nodep, NIL ) );
867: branch( yyval.intval = getlab() );
868: swstart();
869: reached = 0;
870: } break;
871: case 130:
872: # line 657 "../fmip/cgram.y"
873: { yyval.intval=instruct; stwart=instruct=0; } break;
874: case 131:
875: # line 659 "../fmip/cgram.y"
876: { yyval.intval = icons( yypvt[-0].nodep ); instruct=yypvt[-1].intval; } break;
877: case 133:
878: # line 663 "../fmip/cgram.y"
879: { yyval.nodep=0; } break;
880: case 135:
881: # line 668 "../fmip/cgram.y"
882: { goto bop; } break;
883: case 136:
884: # line 672 "../fmip/cgram.y"
885: {
886: preconf:
887: if( yychar==RELOP||yychar==EQUOP||yychar==AND||yychar==OR||yychar==ER ){
888: precplaint:
889: if( hflag ) werror( "precedence confusion possible: parenthesize!" );
890: }
891: bop:
892: yyval.nodep = buildtree( yypvt[-1].intval, yypvt[-2].nodep, yypvt[-0].nodep );
893: } break;
894: case 137:
895: # line 682 "../fmip/cgram.y"
896: { yypvt[-1].intval = COMOP;
897: goto bop;
898: } break;
899: case 138:
900: # line 686 "../fmip/cgram.y"
901: { goto bop; } break;
902: case 139:
903: # line 688 "../fmip/cgram.y"
904: { if(yychar==SHIFTOP) goto precplaint; else goto bop; } break;
905: case 140:
906: # line 690 "../fmip/cgram.y"
907: { if(yychar==SHIFTOP ) goto precplaint; else goto bop; } break;
908: case 141:
909: # line 692 "../fmip/cgram.y"
910: { if(yychar==PLUS||yychar==MINUS) goto precplaint; else goto bop; } break;
911: case 142:
912: # line 694 "../fmip/cgram.y"
913: { goto bop; } break;
914: case 143:
915: # line 696 "../fmip/cgram.y"
916: { goto preconf; } break;
917: case 144:
918: # line 698 "../fmip/cgram.y"
919: { if( yychar==RELOP||yychar==EQUOP ) goto preconf; else goto bop; } break;
920: case 145:
921: # line 700 "../fmip/cgram.y"
922: { if(yychar==RELOP||yychar==EQUOP) goto preconf; else goto bop; } break;
923: case 146:
924: # line 702 "../fmip/cgram.y"
925: { if(yychar==RELOP||yychar==EQUOP) goto preconf; else goto bop; } break;
926: case 147:
927: # line 704 "../fmip/cgram.y"
928: { goto bop; } break;
929: case 148:
930: # line 706 "../fmip/cgram.y"
931: { goto bop; } break;
932: case 149:
933: # line 708 "../fmip/cgram.y"
934: { abop:
935: yyval.nodep = buildtree( ASG yypvt[-2].intval, yypvt[-3].nodep, yypvt[-0].nodep );
936: } break;
937: case 150:
938: # line 712 "../fmip/cgram.y"
939: { goto abop; } break;
940: case 151:
941: # line 714 "../fmip/cgram.y"
942: { goto abop; } break;
943: case 152:
944: # line 716 "../fmip/cgram.y"
945: { goto abop; } break;
946: case 153:
947: # line 718 "../fmip/cgram.y"
948: { goto abop; } break;
949: case 154:
950: # line 720 "../fmip/cgram.y"
951: { goto abop; } break;
952: case 155:
953: # line 722 "../fmip/cgram.y"
954: { goto abop; } break;
955: case 156:
956: # line 724 "../fmip/cgram.y"
957: { goto abop; } break;
958: case 157:
959: # line 726 "../fmip/cgram.y"
960: { yyval.nodep=buildtree(QUEST, yypvt[-4].nodep, buildtree( COLON, yypvt[-2].nodep, yypvt[-0].nodep ) );
961: } break;
962: case 158:
963: # line 729 "../fmip/cgram.y"
964: { werror( "old-fashioned assignment operator" ); goto bop; } break;
965: case 159:
966: # line 731 "../fmip/cgram.y"
967: { goto bop; } break;
968: case 161:
969: # line 735 "../fmip/cgram.y"
970: { yyval.nodep = buildtree( yypvt[-0].intval, yypvt[-1].nodep, bcon(1) ); } break;
971: case 162:
972: # line 737 "../fmip/cgram.y"
973: { ubop:
974: yyval.nodep = buildtree( UNARY yypvt[-1].intval, yypvt[-0].nodep, NIL );
975: } break;
976: case 163:
977: # line 741 "../fmip/cgram.y"
978: { if( ISFTN(yypvt[-0].nodep->in.type) || ISARY(yypvt[-0].nodep->in.type) ){
979: werror( "& before array or function: ignored" );
980: yyval.nodep = yypvt[-0].nodep;
981: }
982: else goto ubop;
983: } break;
984: case 164:
985: # line 748 "../fmip/cgram.y"
986: { goto ubop; } break;
987: case 165:
988: # line 750 "../fmip/cgram.y"
989: {
990: yyval.nodep = buildtree( yypvt[-1].intval, yypvt[-0].nodep, NIL );
991: } break;
992: case 166:
993: # line 754 "../fmip/cgram.y"
994: { yyval.nodep = buildtree( yypvt[-1].intval==INCR ? ASG PLUS : ASG MINUS,
995: yypvt[-0].nodep,
996: bcon(1) );
997: } break;
998: case 167:
999: # line 759 "../fmip/cgram.y"
1000: { yyval.nodep = doszof( yypvt[-0].nodep ); } break;
1001: case 168:
1002: # line 761 "../fmip/cgram.y"
1003: { yyval.nodep = buildtree( CAST, yypvt[-2].nodep, yypvt[-0].nodep );
1004: yyval.nodep->in.left->in.op = FREE;
1005: yyval.nodep->in.op = FREE;
1006: yyval.nodep = yyval.nodep->in.right;
1007: } break;
1008: case 169:
1009: # line 767 "../fmip/cgram.y"
1010: { yyval.nodep = doszof( yypvt[-1].nodep ); } break;
1011: case 170:
1012: # line 769 "../fmip/cgram.y"
1013: { yyval.nodep = buildtree( UNARY MUL, buildtree( PLUS, yypvt[-3].nodep, yypvt[-1].nodep ), NIL ); } break;
1014: case 171:
1015: # line 771 "../fmip/cgram.y"
1016: { yyval.nodep=buildtree(UNARY CALL,yypvt[-1].nodep,NIL); } break;
1017: case 172:
1018: # line 773 "../fmip/cgram.y"
1019: { yyval.nodep=buildtree(CALL,yypvt[-2].nodep,yypvt[-1].nodep); } break;
1020: case 173:
1021: # line 775 "../fmip/cgram.y"
1022: { if( yypvt[-1].intval == DOT ){
1023: if( notlval( yypvt[-2].nodep ) )uerror("structure reference must be addressable");
1024: yypvt[-2].nodep = buildtree( UNARY AND, yypvt[-2].nodep, NIL );
1025: }
1026: idname = yypvt[-0].intval;
1027: yyval.nodep = buildtree( STREF, yypvt[-2].nodep, buildtree( NAME, NIL, NIL ) );
1028: } break;
1029: case 174:
1030: # line 783 "../fmip/cgram.y"
1031: { idname = yypvt[-0].intval;
1032: /* recognize identifiers in initializations */
1033: if( blevel==0 && stab[idname].stype == UNDEF ) {
1034: register NODE *q;
1035: #ifndef FLEXNAMES
1036: werror( "undeclared initializer name %.8s", stab[idname].sname );
1037: #else
1038: werror( "undeclared initializer name %s", stab[idname].sname );
1039: #endif
1040: q = block( FREE, NIL, NIL, INT, 0, INT );
1041: q->tn.rval = idname;
1042: defid( q, EXTERN );
1043: }
1044: yyval.nodep=buildtree(NAME,NIL,NIL);
1045: stab[yypvt[-0].intval].suse = -lineno;
1046: } break;
1047: case 175:
1048: # line 800 "../fmip/cgram.y"
1049: { yyval.nodep=bcon(0);
1050: yyval.nodep->tn.lval = lastcon;
1051: yyval.nodep->tn.rval = NONAME;
1052: if( yypvt[-0].intval ) yyval.nodep->fn.csiz = yyval.nodep->in.type = ctype(LONG);
1053: } break;
1054: case 176:
1055: # line 806 "../fmip/cgram.y"
1056: { yyval.nodep=buildtree(FCON,NIL,NIL);
1057: yyval.nodep->fpn.dval = dcon;
1058: } break;
1059: case 177:
1060: # line 810 "../fmip/cgram.y"
1061: { yyval.nodep = getstr(); /* get string contents */ } break;
1062: case 178:
1063: # line 812 "../fmip/cgram.y"
1064: { yyval.nodep=yypvt[-1].nodep; } break;
1065: case 179:
1066: # line 816 "../fmip/cgram.y"
1067: {
1068: yyval.nodep = tymerge( yypvt[-1].nodep, yypvt[-0].nodep );
1069: yyval.nodep->in.op = NAME;
1070: yypvt[-1].nodep->in.op = FREE;
1071: } break;
1072: case 180:
1073: # line 824 "../fmip/cgram.y"
1074: { yyval.nodep = bdty( NAME, NIL, -1 ); } break;
1075: case 181:
1076: # line 826 "../fmip/cgram.y"
1077: { yyval.nodep = bdty( UNARY CALL, bdty(NAME,NIL,-1),0); } break;
1078: case 182:
1079: # line 828 "../fmip/cgram.y"
1080: { yyval.nodep = bdty( UNARY CALL, yypvt[-3].nodep, 0 ); } break;
1081: case 183:
1082: # line 830 "../fmip/cgram.y"
1083: { goto umul; } break;
1084: case 184:
1085: # line 832 "../fmip/cgram.y"
1086: { goto uary; } break;
1087: case 185:
1088: # line 834 "../fmip/cgram.y"
1089: { goto bary; } break;
1090: case 186:
1091: # line 836 "../fmip/cgram.y"
1092: { yyval.nodep = yypvt[-1].nodep; } break;
1093: case 187:
1094: # line 840 "../fmip/cgram.y"
1095: { if( stab[yypvt[-1].intval].stype == UNDEF ){
1096: register NODE *q;
1097: q = block( FREE, NIL, NIL, FTN|INT, 0, INT );
1098: q->tn.rval = yypvt[-1].intval;
1099: defid( q, EXTERN );
1100: }
1101: idname = yypvt[-1].intval;
1102: yyval.nodep=buildtree(NAME,NIL,NIL);
1103: stab[idname].suse = -lineno;
1104: } break;
1105: }
1106: goto yystack; /* stack new state and value */
1107:
1108: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.