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