SNODE *forstmt(void) /* * Generate a block for a for statement */ { SNODE *snp; int ogc = goodcode,oswb = switchbreak; int plussemi = 0; goodcode |= GF_INLOOP; snp = xalloc(sizeof(SNODE)); snp->next = 0; getsym(); snp->label = snp->exp = snp->s2 = 0; snp->stype = st_for; if (needpunc(openpa,skm_closepa)) { #ifdef CPLUSPLUS /* CPLUSPLUS allows you to declare a variable here */ if (castbegin(lastst)) { if (prm_cplusplus) { ENODE *exp=0,**next = &exp; cbautoinithead = cbautoinittail = 0; dodecl(sc_auto); while (cbautoinithead) { if (*next) { *next = makenode(en_void,(*next),cbautoinithead->exp); next = &(*next)->v.p[1]; } else *next = cbautoinithead->exp; cbautoinithead = cbautoinithead->next; } snp->label = exp; plussemi = 1; } else { generror(ERR_NODECLARE,0,0); while (castbegin(lastst)) getsym(); goto forjoin; } } else forjoin: #endif { if( expression(&snp->label) == 0 ) snp->label = 0; plussemi = needpunc(semicolon,0); } if (plussemi) { doassign(&snp->exp,FALSE,0); if (needpunc(semicolon,0)) { if( expression(&snp->s2) == 0 ) { snp->s2 = 0; } } } needpunc(closepa,skm_closepa); } goodcode |= GF_CONTINUABLE; snp->s1 = cppblockedstatement(); goodcode = ogc; switchbreak = oswb; return snp; }
SNODE *statement(void) /* * statement figures out which of the statement processors * should be called and transfers control to the proper * routine. */ { SNODE *snp, *snp2, **psnp; SNODE *snp3=snp_line(); switch( lastst ) { case kw_asm: asmline = TRUE; getsym(); if (lastst == begin) { getsym(); snp = snp3; if (snp) psnp = &snp->next; else psnp = &snp; *psnp = 0; while (lastst != end && lastst != eof) { *psnp = asm_statement(TRUE); while (*psnp) psnp=&(*psnp)->next; *psnp = snp_line(); while (*psnp) psnp=&(*psnp)->next; } asmline = FALSE; if (lastst == end) getsym(); return snp; } snp = asm_statement(FALSE); asmline = FALSE; break; case semicolon: getsym(); snp = 0; break; case begin: getsym(); snp2 = compoundblock(); snp = xalloc(sizeof(SNODE)); snp->next = 0; snp->exp = snp2; snp->stype = st_block; break; case kw_if: snp = ifstmt(); break; case kw_while: snp = whilestmt(); snp->lst = snp3; snp3 = 0; break; case kw_for: snp = forstmt(); snp->lst = snp3; snp3 = 0; break; case kw_return: snp = retstmt(); goodcode |= GF_RETURN; break; case kw_break: goodcode |= GF_BREAK; switchbreak = 1; snp = breakstmt(); break; case kw_goto: goodcode |= GF_GOTO; snp = gotostmt(); break; case kw_continue: goodcode |= GF_CONTINUE; snp = contstmt(); break; case kw_do: snp = dostmt(); break; case kw_switch: snp = switchstmt(); break; case kw_else: generror(ERR_ELSE,0,0); getsym(); break; case kw__genword: snp = _genwordstmt(); break; case id: while( isspace(lastch) ) getch(); if( lastch == ':') return labelstmt(TRUE); /* else fall through to process expression */ default: #ifdef CPLUSPLUS if (castbegin(lastst)) { if (prm_cplusplus) { cbautoinithead = cbautoinittail = 0; dodecl(sc_auto); snp = cbautoinithead; } else { generror(ERR_NODECLARE,0,skm_semi); snp = 0; } } else #endif { snp = exprstmt(); } break; } if( snp != 0 ) { if (snp3) { snp3->next = snp; snp = snp3; } } return snp; }
int yyparse(void) { struct { YYSTYPE yyv; int yys; } yys[YYMAXDEPTH], *yyp, *yypt; short *yyxi; int yyj, yym, yystate, yyn, yyg; long yychar; YYSTYPE save1, save2; int save3, save4; save1 = yylval; save2 = yyval; save3 = yynerrs; save4 = yyerrflag; yystate = 0; yychar = -1; yynerrs = 0; yyerrflag = 0; yyp = &yys[-1]; goto yystack; ret0: yyn = 0; goto ret; ret1: yyn = 1; goto ret; ret: yylval = save1; yyval = save2; yynerrs = save3; yyerrflag = save4; return yyn; yystack: /* put a state and value onto the stack */ if(yydebug >= 4) fprint(2, "char %s in %s", yytokname(yychar), yystatname(yystate)); yyp++; if(yyp >= &yys[YYMAXDEPTH]) { yyerror("yacc stack overflow"); goto ret1; } yyp->yys = yystate; yyp->yyv = yyval; yynewstate: yyn = yypact[yystate]; if(yyn <= YYFLAG) goto yydefault; /* simple state */ if(yychar < 0) yychar = yylex1(); yyn += yychar; if(yyn < 0 || yyn >= YYLAST) goto yydefault; yyn = yyact[yyn]; if(yychk[yyn] == yychar) { /* valid shift */ yychar = -1; yyval = yylval; yystate = yyn; if(yyerrflag > 0) yyerrflag--; goto yystack; } yydefault: /* default state action */ yyn = yydef[yystate]; if(yyn == -2) { if(yychar < 0) yychar = yylex1(); /* look through exception table */ for(yyxi=yyexca;; yyxi+=2) if(yyxi[0] == -1 && yyxi[1] == yystate) break; for(yyxi += 2;; yyxi += 2) { yyn = yyxi[0]; if(yyn < 0 || yyn == yychar) break; } yyn = yyxi[1]; if(yyn < 0) goto ret0; } if(yyn == 0) { /* error ... attempt to resume parsing */ switch(yyerrflag) { case 0: /* brand new error */ yyerror("syntax error"); yynerrs++; if(yydebug >= 1) { fprint(2, "%s", yystatname(yystate)); fprint(2, "saw %s\n", yytokname(yychar)); } case 1: case 2: /* incompletely recovered error ... try again */ yyerrflag = 3; /* find a state where "error" is a legal shift action */ while(yyp >= yys) { yyn = yypact[yyp->yys] + YYERRCODE; if(yyn >= 0 && yyn < YYLAST) { yystate = yyact[yyn]; /* simulate a shift of "error" */ if(yychk[yystate] == YYERRCODE) goto yystack; } /* the current yyp has no shift onn "error", pop stack */ if(yydebug >= 2) fprint(2, "error recovery pops state %d, uncovers %d\n", yyp->yys, (yyp-1)->yys ); yyp--; } /* there is no state on the stack with an error shift ... abort */ goto ret1; case 3: /* no shift yet; clobber input char */ if(yydebug >= 2) fprint(2, "error recovery discards %s\n", yytokname(yychar)); if(yychar == YYEOFCODE) goto ret1; yychar = -1; goto yynewstate; /* try again in the same state */ } } /* reduction by production yyn */ if(yydebug >= 2) fprint(2, "reduce %d in:\n\t%s", yyn, yystatname(yystate)); yypt = yyp; yyp -= yyr2[yyn]; yyval = (yyp+1)->yyv; yym = yyn; /* consult goto table to find next state */ yyn = yyr1[yyn]; yyg = yypgo[yyn]; yyj = yyg + yyp->yys + 1; if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn) yystate = yyact[yyg]; switch(yym) { case 3: #line 77 "cc.y" { dodecl(xdecl, lastclass, lasttype, Z); } break; case 5: #line 82 "cc.y" { lastdcl = T; firstarg = S; dodecl(xdecl, lastclass, lasttype, yypt[-0].yyv.node); if(lastdcl == T || lastdcl->etype != TFUNC) { diag(yypt[-0].yyv.node, "not a function"); lastdcl = types[TFUNC]; } thisfn = lastdcl; markdcl(); firstdcl = dclstack; argmark(yypt[-0].yyv.node, 0); } break; case 6: #line 96 "cc.y" { argmark(yypt[-2].yyv.node, 1); } break; case 7: #line 100 "cc.y" { Node *n; n = revertdcl(); if(n) yypt[-0].yyv.node = new(OLIST, n, yypt[-0].yyv.node); if(!debug['a'] && !debug['Z']) codgen(yypt[-0].yyv.node, yypt[-4].yyv.node); } break; case 8: #line 112 "cc.y" { dodecl(xdecl, lastclass, lasttype, yypt[-0].yyv.node); } break; case 9: #line 116 "cc.y" { yypt[-0].yyv.node = dodecl(xdecl, lastclass, lasttype, yypt[-0].yyv.node); } break; case 10: #line 120 "cc.y" { doinit(yypt[-3].yyv.node->sym, yypt[-3].yyv.node->type, 0L, yypt[-0].yyv.node); } break; case 13: #line 128 "cc.y" { yyval.node = new(OIND, yypt[-0].yyv.node, Z); yyval.node->garb = simpleg(yypt[-1].yyv.lval); } break; case 15: #line 136 "cc.y" { yyval.node = yypt[-1].yyv.node; } break; case 16: #line 140 "cc.y" { yyval.node = new(OFUNC, yypt[-3].yyv.node, yypt[-1].yyv.node); } break; case 17: #line 144 "cc.y" { yyval.node = new(OARRAY, yypt[-3].yyv.node, yypt[-1].yyv.node); } break; case 18: #line 153 "cc.y" { yyval.node = dodecl(adecl, lastclass, lasttype, Z); } break; case 19: #line 157 "cc.y" { yyval.node = yypt[-1].yyv.node; } break; case 20: #line 163 "cc.y" { dodecl(adecl, lastclass, lasttype, yypt[-0].yyv.node); yyval.node = Z; } break; case 21: #line 168 "cc.y" { yypt[-0].yyv.node = dodecl(adecl, lastclass, lasttype, yypt[-0].yyv.node); } break; case 22: #line 172 "cc.y" { long w; w = yypt[-3].yyv.node->sym->type->width; yyval.node = doinit(yypt[-3].yyv.node->sym, yypt[-3].yyv.node->type, 0L, yypt[-0].yyv.node); yyval.node = contig(yypt[-3].yyv.node->sym, yyval.node, w); } break; case 23: #line 180 "cc.y" { yyval.node = yypt[-2].yyv.node; if(yypt[-0].yyv.node != Z) { yyval.node = yypt[-0].yyv.node; if(yypt[-2].yyv.node != Z) yyval.node = new(OLIST, yypt[-2].yyv.node, yypt[-0].yyv.node); } } break; case 26: #line 197 "cc.y" { dodecl(pdecl, lastclass, lasttype, yypt[-0].yyv.node); } break; case 28: #line 207 "cc.y" { lasttype = yypt[-0].yyv.type; } break; case 30: #line 212 "cc.y" { lasttype = yypt[-0].yyv.type; } break; case 32: #line 218 "cc.y" { lastfield = 0; edecl(CXXX, lasttype, S); } break; case 34: #line 226 "cc.y" { dodecl(edecl, CXXX, lasttype, yypt[-0].yyv.node); } break; case 36: #line 233 "cc.y" { lastbit = 0; firstbit = 1; } break; case 37: #line 238 "cc.y" { yyval.node = new(OBIT, yypt[-2].yyv.node, yypt[-0].yyv.node); } break; case 38: #line 242 "cc.y" { yyval.node = new(OBIT, Z, yypt[-0].yyv.node); } break; case 39: #line 250 "cc.y" { yyval.node = (Z); } break; case 41: #line 257 "cc.y" { yyval.node = new(OIND, (Z), Z); yyval.node->garb = simpleg(yypt[-0].yyv.lval); } break; case 42: #line 262 "cc.y" { yyval.node = new(OIND, yypt[-0].yyv.node, Z); yyval.node->garb = simpleg(yypt[-1].yyv.lval); } break; case 45: #line 271 "cc.y" { yyval.node = new(OFUNC, yypt[-3].yyv.node, yypt[-1].yyv.node); } break; case 46: #line 275 "cc.y" { yyval.node = new(OARRAY, yypt[-3].yyv.node, yypt[-1].yyv.node); } break; case 47: #line 281 "cc.y" { yyval.node = new(OFUNC, (Z), Z); } break; case 48: #line 285 "cc.y" { yyval.node = new(OARRAY, (Z), yypt[-1].yyv.node); } break; case 49: #line 289 "cc.y" { yyval.node = yypt[-1].yyv.node; } break; case 51: #line 296 "cc.y" { yyval.node = new(OINIT, invert(yypt[-1].yyv.node), Z); } break; case 52: #line 302 "cc.y" { yyval.node = new(OARRAY, yypt[-1].yyv.node, Z); } break; case 53: #line 306 "cc.y" { yyval.node = new(OELEM, Z, Z); yyval.node->sym = yypt[-0].yyv.sym; } break; case 56: #line 315 "cc.y" { yyval.node = new(OLIST, yypt[-2].yyv.node, yypt[-1].yyv.node); } break; case 58: #line 320 "cc.y" { yyval.node = new(OLIST, yypt[-1].yyv.node, yypt[-0].yyv.node); } break; case 61: #line 328 "cc.y" { yyval.node = new(OLIST, yypt[-1].yyv.node, yypt[-0].yyv.node); } break; case 62: #line 333 "cc.y" { yyval.node = Z; } break; case 63: #line 337 "cc.y" { yyval.node = invert(yypt[-0].yyv.node); } break; case 65: #line 345 "cc.y" { yyval.node = new(OPROTO, yypt[-0].yyv.node, Z); yyval.node->type = yypt[-1].yyv.type; } break; case 66: #line 350 "cc.y" { yyval.node = new(OPROTO, yypt[-0].yyv.node, Z); yyval.node->type = yypt[-1].yyv.type; } break; case 67: #line 355 "cc.y" { yyval.node = new(ODOTDOT, Z, Z); } break; case 68: #line 359 "cc.y" { yyval.node = new(OLIST, yypt[-2].yyv.node, yypt[-0].yyv.node); } break; case 69: #line 365 "cc.y" { yyval.node = invert(yypt[-1].yyv.node); // if(yypt[-1].yyv.node != Z) // yyval.node = new(OLIST, yypt[-1].yyv.node, yyval.node); if(yyval.node == Z) yyval.node = new(OLIST, Z, Z); } break; case 70: #line 374 "cc.y" { yyval.node = Z; } break; case 71: #line 378 "cc.y" { yyval.node = new(OLIST, yypt[-1].yyv.node, yypt[-0].yyv.node); } break; case 72: #line 382 "cc.y" { yyval.node = new(OLIST, yypt[-1].yyv.node, yypt[-0].yyv.node); } break; case 74: #line 389 "cc.y" { yyval.node = new(OLIST, yypt[-1].yyv.node, yypt[-0].yyv.node); } break; case 75: #line 395 "cc.y" { yyval.node = new(OCASE, yypt[-1].yyv.node, Z); } break; case 76: #line 399 "cc.y" { yyval.node = new(OCASE, Z, Z); } break; case 77: #line 403 "cc.y" { yyval.node = new(OLABEL, dcllabel(yypt[-1].yyv.sym, 1), Z); } break; case 78: #line 409 "cc.y" { yyval.node = Z; } break; case 80: #line 414 "cc.y" { yyval.node = new(OLIST, yypt[-1].yyv.node, yypt[-0].yyv.node); } break; case 82: #line 421 "cc.y" { yyval.node = yypt[-0].yyv.node; } break; case 84: #line 427 "cc.y" { markdcl(); } break; case 85: #line 431 "cc.y" { yyval.node = revertdcl(); if(yyval.node) yyval.node = new(OLIST, yyval.node, yypt[-0].yyv.node); else yyval.node = yypt[-0].yyv.node; } break;