|
|
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.