BSD 3 development
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Fri, 10 Aug 1979 13:43:20 +0000 (05:43 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Fri, 10 Aug 1979 13:43:20 +0000 (05:43 -0800)
Work on file usr/src/cmd/mip/cgram.c

Synthesized-from: 3bsd

usr/src/cmd/mip/cgram.c [new file with mode: 0644]

diff --git a/usr/src/cmd/mip/cgram.c b/usr/src/cmd/mip/cgram.c
new file mode 100644 (file)
index 0000000..25ee65f
--- /dev/null
@@ -0,0 +1,1065 @@
+# define NAME 2
+# define STRING 3
+# define ICON 4
+# define FCON 5
+# define PLUS 6
+# define MINUS 8
+# define MUL 11
+# define AND 14
+# define OR 17
+# define ER 19
+# define QUEST 21
+# define COLON 22
+# define ANDAND 23
+# define OROR 24
+# define ASOP 25
+# define RELOP 26
+# define EQUOP 27
+# define DIVOP 28
+# define SHIFTOP 29
+# define INCOP 30
+# define UNOP 31
+# define STROP 32
+# define TYPE 33
+# define CLASS 34
+# define STRUCT 35
+# define RETURN 36
+# define GOTO 37
+# define IF 38
+# define ELSE 39
+# define SWITCH 40
+# define BREAK 41
+# define CONTINUE 42
+# define WHILE 43
+# define DO 44
+# define FOR 45
+# define DEFAULT 46
+# define CASE 47
+# define SIZEOF 48
+# define ENUM 49
+# define LP 50
+# define RP 51
+# define LC 52
+# define RC 53
+# define LB 54
+# define RB 55
+# define CM 56
+# define SM 57
+# define ASSIGN 58
+
+# line 108 "../mip/cgram.y"
+# include "mfile1"
+#define yyclearin yychar = -1
+#define yyerrok yyerrflag = 0
+extern int yychar;
+extern short yyerrflag;
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 150
+#endif
+YYSTYPE yylval, yyval;
+
+# line 127 "../mip/cgram.y"
+       static int fake = 0;
+       static char fakename[NCHNAM+1];
+# define YYERRCODE 256
+
+# line 814 "../mip/cgram.y"
+
+
+NODE *
+mkty( t, d, s ) unsigned t; {
+       return( block( TYPE, NIL, NIL, t, d, s ) );
+       }
+
+NODE *
+bdty( op, p, v ) NODE *p; {
+       register NODE *q;
+
+       q = block( op, p, NIL, INT, 0, INT );
+
+       switch( op ){
+
+       case UNARY MUL:
+       case UNARY CALL:
+               break;
+
+       case LB:
+               q->right = bcon(v);
+               break;
+
+       case NAME:
+               q->rval = v;
+               break;
+
+       default:
+               cerror( "bad bdty" );
+               }
+
+       return( q );
+       }
+
+dstash( n ){ /* put n into the dimension table */
+       if( curdim >= DIMTABSZ-1 ){
+               cerror( "dimension table overflow");
+               }
+       dimtab[ curdim++ ] = n;
+       }
+
+savebc() {
+       if( psavbc > & asavbc[BCSZ-4 ] ){
+               cerror( "whiles, fors, etc. too deeply nested");
+               }
+       *psavbc++ = brklab;
+       *psavbc++ = contlab;
+       *psavbc++ = flostat;
+       *psavbc++ = swx;
+       flostat = 0;
+       }
+
+resetbc(mask){
+
+       swx = *--psavbc;
+       flostat = *--psavbc | (flostat&mask);
+       contlab = *--psavbc;
+       brklab = *--psavbc;
+
+       }
+
+addcase(p) NODE *p; { /* add case to switch */
+
+       p = optim( p );  /* change enum to ints */
+       if( p->op != ICON ){
+               uerror( "non-constant case expression");
+               return;
+               }
+       if( swp == swtab ){
+               uerror( "case not in switch");
+               return;
+               }
+       if( swp >= &swtab[SWITSZ] ){
+               cerror( "switch table overflow");
+               }
+       swp->sval = p->lval;
+       deflab( swp->slab = getlab() );
+       ++swp;
+       tfree(p);
+       }
+
+adddef(){ /* add default case to switch */
+       if( swtab[swx].slab >= 0 ){
+               uerror( "duplicate default in switch");
+               return;
+               }
+       if( swp == swtab ){
+               uerror( "default not inside switch");
+               return;
+               }
+       deflab( swtab[swx].slab = getlab() );
+       }
+
+swstart(){
+       /* begin a switch block */
+       if( swp >= &swtab[SWITSZ] ){
+               cerror( "switch table overflow");
+               }
+       swx = swp - swtab;
+       swp->slab = -1;
+       ++swp;
+       }
+
+swend(){ /* end a switch block */
+
+       register struct sw *swbeg, *p, *q, *r, *r1;
+       CONSZ temp;
+       int tempi;
+
+       swbeg = &swtab[swx+1];
+
+       /* sort */
+
+       r1 = swbeg;
+       r = swp-1;
+
+       while( swbeg < r ){
+               /* bubble largest to end */
+               for( q=swbeg; q<r; ++q ){
+                       if( q->sval > (q+1)->sval ){
+                               /* swap */
+                               r1 = q+1;
+                               temp = q->sval;
+                               q->sval = r1->sval;
+                               r1->sval = temp;
+                               tempi = q->slab;
+                               q->slab = r1->slab;
+                               r1->slab = tempi;
+                               }
+                       }
+               r = r1;
+               r1 = swbeg;
+               }
+
+       /* it is now sorted */
+
+       for( p = swbeg+1; p<swp; ++p ){
+               if( p->sval == (p-1)->sval ){
+                       uerror( "duplicate case in switch, %d", tempi=p->sval );
+                       return;
+                       }
+               }
+
+       genswitch( swbeg-1, swp-swbeg );
+       swp = swbeg-1;
+       }
+extern short  yyexca[];
+# define YYNPROD 184
+# define YYLAST 1232
+extern short  yyact[];
+extern short  yypact[];
+extern short  yypgo[];
+extern short  yyr1[];
+extern short  yyr2[];
+extern short  yychk[];
+extern short  yydef[];
+#
+# define YYFLAG -1000
+# define YYERROR goto yyerrlab
+# define YYACCEPT return(0)
+# define YYABORT return(1)
+
+/*     parser for yacc output  */
+
+#ifdef YYDEBUG
+int yydebug = 0; /* 1 for debugging */
+#endif
+YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
+int yychar = -1; /* current input token number */
+int yynerrs = 0;  /* number of errors */
+short yyerrflag = 0;  /* error recovery flag */
+
+yyparse() {
+
+       short yys[YYMAXDEPTH];
+       short yyj, yym;
+       register YYSTYPE *yypvt;
+       register short yystate, *yyps, yyn;
+       register YYSTYPE *yypv;
+       register short *yyxi;
+
+       yystate = 0;
+       yychar = -1;
+       yynerrs = 0;
+       yyerrflag = 0;
+       yyps= &yys[-1];
+       yypv= &yyv[-1];
+
+ yystack:    /* put a state and value onto the stack */
+
+#ifdef YYDEBUG
+       if( yydebug  ) printf( "state %d, char 0%o\n", yystate, yychar );
+#endif
+               if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
+               *yyps = yystate;
+               ++yypv;
+               *yypv = yyval;
+
+ yynewstate:
+
+       yyn = yypact[yystate];
+
+       if( yyn<= YYFLAG ) goto yydefault; /* simple state */
+
+       if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
+       if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
+
+       if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
+               yychar = -1;
+               yyval = yylval;
+               yystate = yyn;
+               if( yyerrflag > 0 ) --yyerrflag;
+               goto yystack;
+               }
+
+ yydefault:
+       /* default state action */
+
+       if( (yyn=yydef[yystate]) == -2 ) {
+               if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
+               /* look through exception table */
+
+               for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
+
+               while( *(yyxi+=2) >= 0 ){
+                       if( *yyxi == yychar ) break;
+                       }
+               if( (yyn = yyxi[1]) < 0 ) return(0);   /* accept */
+               }
+
+       if( yyn == 0 ){ /* error */
+               /* error ... attempt to resume parsing */
+
+               switch( yyerrflag ){
+
+               case 0:   /* brand new error */
+
+                       yyerror( "syntax error" );
+               yyerrlab:
+                       ++yynerrs;
+
+               case 1:
+               case 2: /* incompletely recovered error ... try again */
+
+                       yyerrflag = 3;
+
+                       /* find a state where "error" is a legal shift action */
+
+                       while ( yyps >= yys ) {
+                          yyn = yypact[*yyps] + YYERRCODE;
+                          if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
+                             yystate = yyact[yyn];  /* simulate a shift of "error" */
+                             goto yystack;
+                             }
+                          yyn = yypact[*yyps];
+
+                          /* the current yyps has no shift onn "error", pop stack */
+
+#ifdef YYDEBUG
+                          if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
+#endif
+                          --yyps;
+                          --yypv;
+                          }
+
+                       /* there is no state on the stack with an error shift ... abort */
+
+       yyabort:
+                       return(1);
+
+
+               case 3:  /* no shift yet; clobber input char */
+
+#ifdef YYDEBUG
+                       if( yydebug ) printf( "error recovery discards char %d\n", yychar );
+#endif
+
+                       if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
+                       yychar = -1;
+                       goto yynewstate;   /* try again in the same state */
+
+                       }
+
+               }
+
+       /* reduction by production yyn */
+
+#ifdef YYDEBUG
+               if( yydebug ) printf("reduce %d\n",yyn);
+#endif
+               yyps -= yyr2[yyn];
+               yypvt = yypv;
+               yypv -= yyr2[yyn];
+               yyval = yypv[1];
+               yym=yyn;
+                       /* consult goto table to find next state */
+               yyn = yyr1[yyn];
+               yyj = yypgo[yyn] + *yyps + 1;
+               if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
+               switch(yym){
+                       
+case 2:
+# line 133 "../mip/cgram.y"
+ftnend(); break;
+case 3:
+# line 136 "../mip/cgram.y"
+{ curclass = SNULL;  blevel = 0; } break;
+case 4:
+# line 138 "../mip/cgram.y"
+{ curclass = SNULL;  blevel = 0; } break;
+case 5:
+# line 142 "../mip/cgram.y"
+{  yypvt[-1].nodep->op = FREE; } break;
+case 6:
+# line 144 "../mip/cgram.y"
+{  yypvt[-2].nodep->op = FREE; } break;
+case 7:
+# line 145 "../mip/cgram.y"
+{
+                               defid( tymerge(yypvt[-1].nodep,yypvt[-0].nodep), curclass==STATIC?STATIC:EXTDEF );
+#ifndef LINT
+                               pfstab(stab[yypvt[-0].nodep->rval].sname);
+#endif
+                               } break;
+case 8:
+# line 151 "../mip/cgram.y"
+{  
+                           if( blevel ) cerror( "function level error" );
+                           if( reached ) retstat |= NRETVAL; 
+                           yypvt[-3].nodep->op = FREE;
+                           ftnend();
+                           } break;
+case 11:
+# line 162 "../mip/cgram.y"
+{  blevel = 1; } break;
+case 13:
+# line 167 "../mip/cgram.y"
+{  bccode();
+                           locctr(PROG);
+                           } break;
+case 14:
+# line 173 "../mip/cgram.y"
+{  yypvt[-1].nodep->op = FREE; 
+#ifndef LINT
+                           plcstab(blevel);
+#endif
+                           } break;
+case 15:
+# line 179 "../mip/cgram.y"
+{  yypvt[-2].nodep->op = FREE; 
+#ifndef LINT
+                           plcstab(blevel);
+#endif
+                           } break;
+case 16:
+# line 187 "../mip/cgram.y"
+{  yypvt[-1].nodep->op = FREE; } break;
+case 17:
+# line 189 "../mip/cgram.y"
+{  yypvt[-2].nodep->op = FREE; } break;
+case 19:
+# line 193 "../mip/cgram.y"
+{ curclass = SNULL;  yypvt[-2].nodep->op = FREE; } break;
+case 20:
+# line 195 "../mip/cgram.y"
+{ curclass = SNULL;  yypvt[-1].nodep->op = FREE; } break;
+case 21:
+# line 197 "../mip/cgram.y"
+{  curclass = SNULL; } break;
+case 23:
+# line 201 "../mip/cgram.y"
+{  yyval.nodep = mkty(INT,0,INT);  curclass = SNULL; } break;
+case 24:
+# line 204 "../mip/cgram.y"
+{  yyval.nodep = yypvt[-0].nodep; } break;
+case 26:
+# line 207 "../mip/cgram.y"
+{  yyval.nodep = mkty(INT,0,INT); } break;
+case 27:
+# line 209 "../mip/cgram.y"
+{ curclass = SNULL ; } break;
+case 28:
+# line 214 "../mip/cgram.y"
+{  curclass = yypvt[-0].intval; } break;
+case 30:
+# line 219 "../mip/cgram.y"
+{  yypvt[-1].nodep->type = types( yypvt[-1].nodep->type, yypvt[-0].nodep->type, UNDEF );
+                           yypvt[-0].nodep->op = FREE;
+                           } break;
+case 31:
+# line 223 "../mip/cgram.y"
+{  yypvt[-2].nodep->type = types( yypvt[-2].nodep->type, yypvt[-1].nodep->type, yypvt[-0].nodep->type );
+                           yypvt[-1].nodep->op = yypvt[-0].nodep->op = FREE;
+                           } break;
+case 34:
+# line 231 "../mip/cgram.y"
+{ yyval.nodep = dclstruct(yypvt[-4].intval); } break;
+case 35:
+# line 233 "../mip/cgram.y"
+{  yyval.nodep = rstruct(yypvt[-0].intval,0);  stwart = instruct; } break;
+case 36:
+# line 237 "../mip/cgram.y"
+{  yyval.intval = bstruct(-1,0); } break;
+case 37:
+# line 239 "../mip/cgram.y"
+{  yyval.intval = bstruct(yypvt[-0].intval,0); } break;
+case 40:
+# line 247 "../mip/cgram.y"
+{  moedef( yypvt[-0].intval ); } break;
+case 41:
+# line 249 "../mip/cgram.y"
+{  strucoff = yypvt[-0].intval;  moedef( yypvt[-2].intval ); } break;
+case 42:
+# line 253 "../mip/cgram.y"
+{ yyval.nodep = dclstruct(yypvt[-4].intval);  } break;
+case 43:
+# line 255 "../mip/cgram.y"
+{  yyval.nodep = rstruct(yypvt[-0].intval,yypvt[-1].intval); } break;
+case 44:
+# line 259 "../mip/cgram.y"
+{  yyval.intval = bstruct(-1,yypvt[-0].intval);  stwart=0; } break;
+case 45:
+# line 261 "../mip/cgram.y"
+{  yyval.intval = bstruct(yypvt[-0].intval,yypvt[-1].intval);  stwart=0;  } break;
+case 48:
+# line 269 "../mip/cgram.y"
+{ curclass = SNULL;  stwart=0; yypvt[-1].nodep->op = FREE; } break;
+case 49:
+# line 271 "../mip/cgram.y"
+{  if( curclass != MOU ){
+                               curclass = SNULL;
+                               }
+                           else {
+                               sprintf( fakename, "$%dFAKE", fake++ );
+                               defid( tymerge(yypvt[-0].nodep, bdty(NAME,NIL,lookup( fakename, SMOS ))), curclass );
+                               }
+                           stwart = 0;
+                           yypvt[-0].nodep->op = FREE;
+                           } break;
+case 50:
+# line 285 "../mip/cgram.y"
+{ defid( tymerge(yypvt[-1].nodep,yypvt[-0].nodep), curclass);  stwart = instruct; } break;
+case 51:
+# line 286 "../mip/cgram.y"
+{yyval.nodep=yypvt[-2].nodep;} break;
+case 52:
+# line 287 "../mip/cgram.y"
+{ defid( tymerge(yypvt[-4].nodep,yypvt[-0].nodep), curclass);  stwart = instruct; } break;
+case 55:
+# line 293 "../mip/cgram.y"
+{  if( !(instruct&INSTRUCT) ) uerror( "field outside of structure" );
+                           if( yypvt[-0].intval<0 || yypvt[-0].intval >= FIELD ){
+                               uerror( "illegal field size" );
+                               yypvt[-0].intval = 1;
+                               }
+                           defid( tymerge(yypvt[-3].nodep,yypvt[-2].nodep), FIELD|yypvt[-0].intval );
+                           yyval.nodep = NIL;
+                           } break;
+case 56:
+# line 303 "../mip/cgram.y"
+{  if( !(instruct&INSTRUCT) ) uerror( "field outside of structure" );
+                           falloc( stab, yypvt[-0].intval, -1, yypvt[-2].nodep );  /* alignment or hole */
+                           yyval.nodep = NIL;
+                           } break;
+case 57:
+# line 308 "../mip/cgram.y"
+{  yyval.nodep = NIL; } break;
+case 58:
+# line 313 "../mip/cgram.y"
+{  umul:
+                               yyval.nodep = bdty( UNARY MUL, yypvt[-0].nodep, 0 ); } break;
+case 59:
+# line 316 "../mip/cgram.y"
+{  uftn:
+                               yyval.nodep = bdty( UNARY CALL, yypvt[-2].nodep, 0 );  } break;
+case 60:
+# line 319 "../mip/cgram.y"
+{  uary:
+                               yyval.nodep = bdty( LB, yypvt[-2].nodep, 0 );  } break;
+case 61:
+# line 322 "../mip/cgram.y"
+{  bary:
+                               if( (int)yypvt[-1].intval <= 0 ) werror( "zero or negative subscript" );
+                               yyval.nodep = bdty( LB, yypvt[-3].nodep, yypvt[-1].intval );  } break;
+case 62:
+# line 326 "../mip/cgram.y"
+{  yyval.nodep = bdty( NAME, NIL, yypvt[-0].intval );  } break;
+case 63:
+# line 328 "../mip/cgram.y"
+{ yyval.nodep=yypvt[-1].nodep; } break;
+case 64:
+# line 331 "../mip/cgram.y"
+{  goto umul; } break;
+case 65:
+# line 333 "../mip/cgram.y"
+{  goto uftn; } break;
+case 66:
+# line 335 "../mip/cgram.y"
+{  goto uary; } break;
+case 67:
+# line 337 "../mip/cgram.y"
+{  goto bary; } break;
+case 68:
+# line 339 "../mip/cgram.y"
+{ yyval.nodep = yypvt[-1].nodep; } break;
+case 69:
+# line 341 "../mip/cgram.y"
+{
+                               if( blevel!=0 ) uerror("function declaration in bad context");
+                               yyval.nodep = bdty( UNARY CALL, bdty(NAME,NIL,yypvt[-2].intval), 0 );
+                               stwart = 0;
+                               } break;
+case 70:
+# line 347 "../mip/cgram.y"
+{
+                               yyval.nodep = bdty( UNARY CALL, bdty(NAME,NIL,yypvt[-1].intval), 0 );
+                               stwart = 0;
+                               } break;
+case 71:
+# line 354 "../mip/cgram.y"
+{
+                               /* turn off typedefs for argument names */
+                               stwart = SEENAME;
+                               } break;
+case 72:
+# line 361 "../mip/cgram.y"
+{ ftnarg( yypvt[-0].intval );  stwart = SEENAME; } break;
+case 73:
+# line 363 "../mip/cgram.y"
+{ ftnarg( yypvt[-0].intval );  stwart = SEENAME; } break;
+case 75:
+# line 368 "../mip/cgram.y"
+{yyval.nodep=yypvt[-2].nodep;} break;
+case 77:
+# line 372 "../mip/cgram.y"
+{  defid( yypvt[-0].nodep = tymerge(yypvt[-1].nodep,yypvt[-0].nodep), curclass);
+                           beginit(yypvt[-0].nodep->rval);
+                           } break;
+case 79:
+# line 379 "../mip/cgram.y"
+{  nidcl( tymerge(yypvt[-1].nodep,yypvt[-0].nodep) ); } break;
+case 80:
+# line 381 "../mip/cgram.y"
+{  defid( tymerge(yypvt[-1].nodep,yypvt[-0].nodep), uclass(curclass) );
+                       } break;
+case 81:
+# line 385 "../mip/cgram.y"
+{  doinit( yypvt[-0].nodep );
+                           endinit(); } break;
+case 82:
+# line 388 "../mip/cgram.y"
+{  endinit(); } break;
+case 85:
+# line 397 "../mip/cgram.y"
+{  doinit( yypvt[-0].nodep ); } break;
+case 86:
+# line 399 "../mip/cgram.y"
+{  irbrace(); } break;
+case 91:
+# line 411 "../mip/cgram.y"
+{  werror( "old-fashioned initialization: use =" ); } break;
+case 93:
+# line 416 "../mip/cgram.y"
+{  ilbrace(); } break;
+case 96:
+# line 426 "../mip/cgram.y"
+{  
+#ifndef LINT
+                           prcstab(blevel);
+#endif
+                           --blevel;
+                           if( blevel == 1 ) blevel = 0;
+                           clearst( blevel );
+                           checkst( blevel );
+                           autooff = *--psavbc;
+                           regvar = *--psavbc;
+                           } break;
+case 97:
+# line 440 "../mip/cgram.y"
+{  --blevel;
+                           if( blevel == 1 ) blevel = 0;
+                           clearst( blevel );
+                           checkst( blevel );
+                           autooff = *--psavbc;
+                           regvar = *--psavbc;
+                           } break;
+case 98:
+# line 450 "../mip/cgram.y"
+{  if( blevel == 1 ) dclargs();
+                           ++blevel;
+                           if( psavbc > &asavbc[BCSZ-2] ) cerror( "nesting too deep" );
+                           *psavbc++ = regvar;
+                           *psavbc++ = autooff;
+                           } break;
+case 99:
+# line 459 "../mip/cgram.y"
+{ ecomp( yypvt[-1].nodep ); } break;
+case 101:
+# line 462 "../mip/cgram.y"
+{ deflab(yypvt[-1].intval);
+                          reached = 1;
+                          } break;
+case 102:
+# line 466 "../mip/cgram.y"
+{  if( yypvt[-1].intval != NOLAB ){
+                               deflab( yypvt[-1].intval );
+                               reached = 1;
+                               }
+                           } break;
+case 103:
+# line 472 "../mip/cgram.y"
+{  branch(  contlab );
+                           deflab( brklab );
+                           if( (flostat&FBRK) || !(flostat&FLOOP)) reached = 1;
+                           else reached = 0;
+                           resetbc(0);
+                           } break;
+case 104:
+# line 479 "../mip/cgram.y"
+{  deflab( contlab );
+                           if( flostat & FCONT ) reached = 1;
+                           ecomp( buildtree( CBRANCH, buildtree( NOT, yypvt[-2].nodep, NIL ), bcon( yypvt[-6].intval ) ) );
+                           deflab( brklab );
+                           reached = 1;
+                           resetbc(0);
+                           } break;
+case 105:
+# line 487 "../mip/cgram.y"
+{  deflab( contlab );
+                           if( flostat&FCONT ) reached = 1;
+                           if( yypvt[-2].nodep ) ecomp( yypvt[-2].nodep );
+                           branch( yypvt[-3].intval );
+                           deflab( brklab );
+                           if( (flostat&FBRK) || !(flostat&FLOOP) ) reached = 1;
+                           else reached = 0;
+                           resetbc(0);
+                           } break;
+case 106:
+# line 497 "../mip/cgram.y"
+{  if( reached ) branch( brklab );
+                           deflab( yypvt[-1].intval );
+                          swend();
+                           deflab(brklab);
+                           if( (flostat&FBRK) || !(flostat&FDEF) ) reached = 1;
+                           resetbc(FCONT);
+                           } break;
+case 107:
+# line 505 "../mip/cgram.y"
+{  if( brklab == NOLAB ) uerror( "illegal break");
+                           else if(reached) branch( brklab );
+                           flostat |= FBRK;
+                           if( brkflag ) goto rch;
+                           reached = 0;
+                           } break;
+case 108:
+# line 512 "../mip/cgram.y"
+{  if( contlab == NOLAB ) uerror( "illegal continue");
+                           else branch( contlab );
+                           flostat |= FCONT;
+                           goto rch;
+                           } break;
+case 109:
+# line 518 "../mip/cgram.y"
+{  retstat |= NRETVAL;
+                           branch( retlab );
+                       rch:
+                           if( !reached ) werror( "statement not reached");
+                           reached = 0;
+                           } break;
+case 110:
+# line 525 "../mip/cgram.y"
+{  register NODE *temp;
+                           idname = curftn;
+                           temp = buildtree( NAME, NIL, NIL );
+                           temp->type = DECREF( temp->type );
+                           temp = buildtree( RETURN, temp, yypvt[-1].nodep );
+                           /* now, we have the type of the RHS correct */
+                           temp->left->op = FREE;
+                           temp->op = FREE;
+                           ecomp( buildtree( FORCE, temp->right, NIL ) );
+                           retstat |= RETVAL;
+                           branch( retlab );
+                           reached = 0;
+                           } break;
+case 111:
+# line 539 "../mip/cgram.y"
+{  register NODE *q;
+                           q = block( FREE, NIL, NIL, INT|ARY, 0, INT );
+                           q->rval = idname = yypvt[-1].intval;
+                           defid( q, ULABEL );
+                           stab[idname].suse = -lineno;
+                           branch( stab[idname].offset );
+                           goto rch;
+                           } break;
+case 116:
+# line 553 "../mip/cgram.y"
+{  register NODE *q;
+                           q = block( FREE, NIL, NIL, INT|ARY, 0, LABEL );
+                           q->rval = yypvt[-1].intval;
+                           defid( q, LABEL );
+                           reached = 1;
+                           } break;
+case 117:
+# line 560 "../mip/cgram.y"
+{  addcase(yypvt[-1].nodep);
+                           reached = 1;
+                           } break;
+case 118:
+# line 564 "../mip/cgram.y"
+{  reached = 1;
+                           adddef();
+                           flostat |= FDEF;
+                           } break;
+case 119:
+# line 570 "../mip/cgram.y"
+{  savebc();
+                           if( !reached ) werror( "loop not entered at top");
+                           brklab = getlab();
+                           contlab = getlab();
+                           deflab( yyval.intval = getlab() );
+                           reached = 1;
+                           } break;
+case 120:
+# line 579 "../mip/cgram.y"
+{  ecomp( buildtree( CBRANCH, yypvt[-1].nodep, bcon( yyval.intval=getlab()) ) ) ;
+                           reached = 1;
+                           } break;
+case 121:
+# line 584 "../mip/cgram.y"
+{  if( reached ) branch( yyval.intval = getlab() );
+                           else yyval.intval = NOLAB;
+                           deflab( yypvt[-2].intval );
+                           reached = 1;
+                           } break;
+case 122:
+# line 592 "../mip/cgram.y"
+{  savebc();
+                           if( !reached ) werror( "loop not entered at top");
+                           if( yypvt[-1].nodep->op == ICON && yypvt[-1].nodep->lval != 0 ) flostat = FLOOP;
+                           deflab( contlab = getlab() );
+                           reached = 1;
+                           brklab = getlab();
+                           if( flostat == FLOOP ) tfree( yypvt[-1].nodep );
+                           else ecomp( buildtree( CBRANCH, yypvt[-1].nodep, bcon( brklab) ) );
+                           } break;
+case 123:
+# line 603 "../mip/cgram.y"
+{  if( yypvt[-3].nodep ) ecomp( yypvt[-3].nodep );
+                           else if( !reached ) werror( "loop not entered at top");
+                           savebc();
+                           contlab = getlab();
+                           brklab = getlab();
+                           deflab( yyval.intval = getlab() );
+                           reached = 1;
+                           if( yypvt[-1].nodep ) ecomp( buildtree( CBRANCH, yypvt[-1].nodep, bcon( brklab) ) );
+                           else flostat |= FLOOP;
+                           } break;
+case 124:
+# line 615 "../mip/cgram.y"
+{  savebc();
+                           brklab = getlab();
+                           ecomp( buildtree( FORCE, yypvt[-1].nodep, NIL ) );
+                           branch( yyval.intval = getlab() );
+                           swstart();
+                           reached = 0;
+                           } break;
+case 125:
+# line 624 "../mip/cgram.y"
+{ yyval.intval=instruct; stwart=instruct=0; } break;
+case 126:
+# line 626 "../mip/cgram.y"
+{  yyval.intval = icons( yypvt[-0].nodep );  instruct=yypvt[-1].intval; } break;
+case 128:
+# line 630 "../mip/cgram.y"
+{ yyval.nodep=0; } break;
+case 130:
+# line 635 "../mip/cgram.y"
+{  goto bop; } break;
+case 131:
+# line 639 "../mip/cgram.y"
+{
+                       preconf:
+                           if( yychar==RELOP||yychar==EQUOP||yychar==AND||yychar==OR||yychar==ER ){
+                           precplaint:
+                               if( hflag ) werror( "precedence confusion possible: parenthesize!" );
+                               }
+                       bop:
+                           yyval.nodep = buildtree( yypvt[-1].intval, yypvt[-2].nodep, yypvt[-0].nodep );
+                           } break;
+case 132:
+# line 649 "../mip/cgram.y"
+{  yypvt[-1].intval = COMOP;
+                           goto bop;
+                           } break;
+case 133:
+# line 653 "../mip/cgram.y"
+{  goto bop; } break;
+case 134:
+# line 655 "../mip/cgram.y"
+{  if(yychar==SHIFTOP) goto precplaint; else goto bop; } break;
+case 135:
+# line 657 "../mip/cgram.y"
+{  if(yychar==SHIFTOP ) goto precplaint; else goto bop; } break;
+case 136:
+# line 659 "../mip/cgram.y"
+{  if(yychar==PLUS||yychar==MINUS) goto precplaint; else goto bop; } break;
+case 137:
+# line 661 "../mip/cgram.y"
+{  goto bop; } break;
+case 138:
+# line 663 "../mip/cgram.y"
+{  goto preconf; } break;
+case 139:
+# line 665 "../mip/cgram.y"
+{  if( yychar==RELOP||yychar==EQUOP ) goto preconf;  else goto bop; } break;
+case 140:
+# line 667 "../mip/cgram.y"
+{  if(yychar==RELOP||yychar==EQUOP) goto preconf; else goto bop; } break;
+case 141:
+# line 669 "../mip/cgram.y"
+{  if(yychar==RELOP||yychar==EQUOP) goto preconf; else goto bop; } break;
+case 142:
+# line 671 "../mip/cgram.y"
+{  goto bop; } break;
+case 143:
+# line 673 "../mip/cgram.y"
+{  goto bop; } break;
+case 144:
+# line 675 "../mip/cgram.y"
+{  abop:
+                               yyval.nodep = buildtree( ASG yypvt[-2].intval, yypvt[-3].nodep, yypvt[-0].nodep );
+                               } break;
+case 145:
+# line 679 "../mip/cgram.y"
+{  goto abop; } break;
+case 146:
+# line 681 "../mip/cgram.y"
+{  goto abop; } break;
+case 147:
+# line 683 "../mip/cgram.y"
+{  goto abop; } break;
+case 148:
+# line 685 "../mip/cgram.y"
+{  goto abop; } break;
+case 149:
+# line 687 "../mip/cgram.y"
+{  goto abop; } break;
+case 150:
+# line 689 "../mip/cgram.y"
+{  goto abop; } break;
+case 151:
+# line 691 "../mip/cgram.y"
+{  goto abop; } break;
+case 152:
+# line 693 "../mip/cgram.y"
+{  yyval.nodep=buildtree(QUEST, yypvt[-4].nodep, buildtree( COLON, yypvt[-2].nodep, yypvt[-0].nodep ) );
+                           } break;
+case 153:
+# line 696 "../mip/cgram.y"
+{  werror( "old-fashioned assignment operator" );  goto bop; } break;
+case 154:
+# line 698 "../mip/cgram.y"
+{  goto bop; } break;
+case 156:
+# line 702 "../mip/cgram.y"
+{  yyval.nodep = buildtree( yypvt[-0].intval, yypvt[-1].nodep, bcon(1) ); } break;
+case 157:
+# line 704 "../mip/cgram.y"
+{ ubop:
+                           yyval.nodep = buildtree( UNARY yypvt[-1].intval, yypvt[-0].nodep, NIL );
+                           } break;
+case 158:
+# line 708 "../mip/cgram.y"
+{  if( ISFTN(yypvt[-0].nodep->type) || ISARY(yypvt[-0].nodep->type) ){
+                               werror( "& before array or function: ignored" );
+                               yyval.nodep = yypvt[-0].nodep;
+                               }
+                           else goto ubop;
+                           } break;
+case 159:
+# line 715 "../mip/cgram.y"
+{  goto ubop; } break;
+case 160:
+# line 717 "../mip/cgram.y"
+{
+                           yyval.nodep = buildtree( yypvt[-1].intval, yypvt[-0].nodep, NIL );
+                           } break;
+case 161:
+# line 721 "../mip/cgram.y"
+{  yyval.nodep = buildtree( yypvt[-1].intval==INCR ? ASG PLUS : ASG MINUS,
+                                               yypvt[-0].nodep,
+                                               bcon(1)  );
+                           } break;
+case 162:
+# line 726 "../mip/cgram.y"
+{  yyval.nodep = doszof( yypvt[-0].nodep ); } break;
+case 163:
+# line 728 "../mip/cgram.y"
+{  yyval.nodep = buildtree( CAST, yypvt[-2].nodep, yypvt[-0].nodep );
+                           yyval.nodep->left->op = FREE;
+                           yyval.nodep->op = FREE;
+                           yyval.nodep = yyval.nodep->right;
+                           } break;
+case 164:
+# line 734 "../mip/cgram.y"
+{  yyval.nodep = doszof( yypvt[-1].nodep ); } break;
+case 165:
+# line 736 "../mip/cgram.y"
+{  yyval.nodep = buildtree( UNARY MUL, buildtree( PLUS, yypvt[-3].nodep, yypvt[-1].nodep ), NIL ); } break;
+case 166:
+# line 738 "../mip/cgram.y"
+{  yyval.nodep=buildtree(UNARY CALL,yypvt[-1].nodep,NIL); } break;
+case 167:
+# line 740 "../mip/cgram.y"
+{  yyval.nodep=buildtree(CALL,yypvt[-2].nodep,yypvt[-1].nodep); } break;
+case 168:
+# line 742 "../mip/cgram.y"
+{  if( yypvt[-1].intval == DOT ){
+                               yypvt[-2].nodep = buildtree( UNARY AND, yypvt[-2].nodep, NIL );
+                               }
+                           idname = yypvt[-0].intval;
+                           yyval.nodep = buildtree( STREF, yypvt[-2].nodep, buildtree( NAME, NIL, NIL ) );
+                           } break;
+case 169:
+# line 749 "../mip/cgram.y"
+{  idname = yypvt[-0].intval;
+                           /* recognize identifiers in initializations */
+                           if( blevel==0 && stab[idname].stype == UNDEF ) {
+                               register NODE *q;
+                               werror( "undeclared initializer name %.8s", stab[idname].sname );
+                               q = block( FREE, NIL, NIL, INT, 0, INT );
+                               q->rval = idname;
+                               defid( q, EXTERN );
+                               }
+                           yyval.nodep=buildtree(NAME,NIL,NIL);
+                           stab[yypvt[-0].intval].suse = -lineno;
+                       } break;
+case 170:
+# line 762 "../mip/cgram.y"
+{  yyval.nodep=bcon(0);
+                           yyval.nodep->lval = lastcon;
+                           yyval.nodep->rval = NONAME;
+                           if( yypvt[-0].intval ) yyval.nodep->csiz = yyval.nodep->type = ctype(LONG);
+                           } break;
+case 171:
+# line 768 "../mip/cgram.y"
+{  yyval.nodep=buildtree(FCON,NIL,NIL);
+                           yyval.nodep->dval = dcon;
+                           } break;
+case 172:
+# line 772 "../mip/cgram.y"
+{  yyval.nodep = getstr(); /* get string contents */ } break;
+case 173:
+# line 774 "../mip/cgram.y"
+{ yyval.nodep=yypvt[-1].nodep; } break;
+case 174:
+# line 778 "../mip/cgram.y"
+{
+                       yyval.nodep = tymerge( yypvt[-1].nodep, yypvt[-0].nodep );
+                       yyval.nodep->op = NAME;
+                       yypvt[-1].nodep->op = FREE;
+                       } break;
+case 175:
+# line 786 "../mip/cgram.y"
+{ yyval.nodep = bdty( NAME, NIL, -1 ); } break;
+case 176:
+# line 788 "../mip/cgram.y"
+{ yyval.nodep = bdty( UNARY CALL, bdty(NAME,NIL,-1),0); } break;
+case 177:
+# line 790 "../mip/cgram.y"
+{  yyval.nodep = bdty( UNARY CALL, yypvt[-3].nodep, 0 ); } break;
+case 178:
+# line 792 "../mip/cgram.y"
+{  goto umul; } break;
+case 179:
+# line 794 "../mip/cgram.y"
+{  goto uary; } break;
+case 180:
+# line 796 "../mip/cgram.y"
+{  goto bary;  } break;
+case 181:
+# line 798 "../mip/cgram.y"
+{ yyval.nodep = yypvt[-1].nodep; } break;
+case 182:
+# line 802 "../mip/cgram.y"
+{  if( stab[yypvt[-1].intval].stype == UNDEF ){
+                               register NODE *q;
+                               q = block( FREE, NIL, NIL, FTN|INT, 0, INT );
+                               q->rval = yypvt[-1].intval;
+                               defid( q, EXTERN );
+                               }
+                           idname = yypvt[-1].intval;
+                           yyval.nodep=buildtree(NAME,NIL,NIL);
+                           stab[idname].suse = -lineno;
+                       } break;
+               }
+               goto yystack;  /* stack new state and value */
+
+       }