void do_stmt(VarList curtree) { bool needBranch = true; String label1 = new_label(); // loop start String label2 = new_label(); // loop end String label3 = new_label(); String label4 = new_label(); Var procvar = new Var(); procvar.setName(curtree.genName()); procvar.setType(Var.VAR_BLOCK); procvar.nodes = new VarList(); for (int i=0; i<curtree.Length(); i++) if ((curtree.FindByIndex(i).type & (Var.VAR_LOCAL|Var.VAR_PARAM|Var.VAR_LABEL)) != 0) procvar.add(curtree.FindByIndex(i)); io.Message(tok+"[DO]"); tok.scan(); switch (tok.getId()) { case Tok.TOK_WHILE: io.Message(tok+"[WhileStatement]"); emit.Label(label1); tok.scan(); bool_expr(0); null_stmt(); emit.Branch("brfalse", label2); break; case Tok.TOK_IDENT: // TODO assign_stmt(curtree); if (tok.getId() != Tok.TOK_TO) io.Abort("PL0123: TO expected"); tok.scan(); bool_expr(0); null_stmt(); break; case Tok.TOK_CASE: io.Message(tok+"[CaseStatement]"); tok.scan(); break; case Tok.TOK_1_SEMI: io.Message(tok+"[;]"); needBranch = false; tok.scan(); break; } do { stmt(procvar.nodes, label2, label1); } while (tok.getId() != Tok.TOK_END); if (needBranch) emit.Branch("br", label1); if (tok.getId() != Tok.TOK_END) io.Abort("PL0124: END expected"); io.Message(tok+"[END]"); tok.scan(); curtree.add(procvar); if (needBranch) emit.Label(label2); }
void do_stmt(VarList curtree) { bool needBranch = true; String label1 = new_label(); // loop start String label2 = new_label(); // loop end String label3 = new_label(); String label4 = new_label(); Var procvar = new Var(); procvar.setName(curtree.genName()); procvar.setType(Var.VAR_BLOCK); procvar.nodes = new VarList(); for (int i = 0; i < curtree.Length(); i++) { if ((curtree.FindByIndex(i).type & (Var.VAR_LOCAL | Var.VAR_PARAM | Var.VAR_LABEL)) != 0) { procvar.add(curtree.FindByIndex(i)); } } io.Message(tok + "[DO]"); tok.scan(); switch (tok.getId()) { case Tok.TOK_WHILE: io.Message(tok + "[WhileStatement]"); emit.Label(label1); tok.scan(); bool_expr(0); null_stmt(); emit.Branch("brfalse", label2); break; case Tok.TOK_IDENT: // TODO assign_stmt(curtree); if (tok.getId() != Tok.TOK_TO) { io.Abort("PL0123: TO expected"); } tok.scan(); bool_expr(0); null_stmt(); break; case Tok.TOK_CASE: io.Message(tok + "[CaseStatement]"); tok.scan(); break; case Tok.TOK_1_SEMI: io.Message(tok + "[;]"); needBranch = false; tok.scan(); break; } do { stmt(procvar.nodes, label2, label1); } while (tok.getId() != Tok.TOK_END); if (needBranch) { emit.Branch("br", label1); } if (tok.getId() != Tok.TOK_END) { io.Abort("PL0124: END expected"); } io.Message(tok + "[END]"); tok.scan(); curtree.add(procvar); if (needBranch) { emit.Label(label2); } }