void IfElse::gen(label before, label after) { label iftrue = newlabel(); label iffalse = newlabel(); e->jumping(0,iffalse); emitlabel(iftrue); stmt1->gen(iftrue,after); emit("goto L"+after); emitlabel(iffalse); stmt2->gen(iffalse,after); }
void DoWhile::gen(label before, label after) { label test = newlabel(); s->gen(before,test); emitlabel(test); e->jumping(before,0); }
void If::gen(label before, label after) { label iftrue = newlabel(); e->jumping(0,after); emitlabel(iftrue); s->gen(iftrue,after); }
Expr * Logical::gen() { int f = newlabel(); int a = newlabel(); Temp * temp = new Temp(this->type); this->jumping(0,f); //emit(temp->toString() + " = true"); emit("(=, true, " + temp->toString() + ")"); log_buffer << a; emit("goto L" + log_buffer.str()); log_buffer.str(""); emitlabel(f); //emit(temp->toString() + " = false"); emit("(=, false, " + temp->toString() + ")"); emitlabel(a); return temp; }
void Seq::gen(label begin , label after){ if(s1 == Stmt::Null) s2->gen(begin,after); else if(s2 == Stmt::Null) s1->gen(begin,after); else if(s1 != Stmt::Null && s2 != Stmt::Null){ label l = newlabel(); s1->gen(begin,l); emitlabel(l); s2->gen(l,after); } }
int main(int argc, char *argv[]) { int c, i; Nonterm p; for (i = 1; i < argc; i++) if (strcmp(argv[i], "-T") == 0) Tflag = 1; else if (strncmp(argv[i], "-p", 2) == 0 && argv[i][2]) prefix = &argv[i][2]; else if (strncmp(argv[i], "-p", 2) == 0 && i + 1 < argc) prefix = argv[++i]; else if (*argv[i] == '-' && argv[i][1]) { yyerror("usage: %s [-T | -p prefix]... [ [ input ] output ] \n", argv[0]); exit(1); } else if (infp == NULL) { if (strcmp(argv[i], "-") == 0) infp = stdin; else if ((infp = fopen(argv[i], "r")) == NULL) { yyerror("%s: can't read `%s'\n", argv[0], argv[i]); exit(1); } } else if (outfp == NULL) { if (strcmp(argv[i], "-") == 0) outfp = stdout; if ((outfp = fopen(argv[i], "w")) == NULL) { yyerror("%s: can't write `%s'\n", argv[0], argv[i]); exit(1); } } if (infp == NULL) infp = stdin; if (outfp == NULL) outfp = stdout; yyparse(); if (start) ckreach(start); for (p = nts; p; p = p->link) { if (p->rules == NULL) yyerror("undefined nonterminal `%s'\n", p->name); if (!p->reached) yyerror("can't reach nonterminal `%s'\n", p->name); } emitheader(); emitdefs(nts, ntnumber); emitstruct(nts, ntnumber); emitnts(rules, nrules); emitstring(rules); emitrule(nts); emitclosure(nts); if (start) emitlabel(terms, start, ntnumber); emitkids(rules, nrules); if (!feof(infp)) while ((c = getc(infp)) != EOF) putc(c, outfp); while (memlist) { /* for purify */ struct block *q = memlist->link; free(memlist); memlist = q; } return errcnt > 0; }