void jvmcodegen::gen_if_stmt(const ast::node_ptr &node) { auto ifstmt = ast::to_if_stmt(node); int else_label = get_next_label(); int end_label = get_next_label(); gen_node(ifstmt->eval_expr); m_out << fmt::sprintf("ifeq L%d\n", else_label); m_stack.push(m_symtable->get_scope(ifstmt->true_scope_id)); for (const auto& stmt : ifstmt->true_statements) { gen_node(stmt); } m_out << fmt::sprintf("goto L%d\n", end_label); m_out << fmt::sprintf("L%d:\n", else_label); m_stack.pop(); m_stack.push(m_symtable->get_scope(ifstmt->false_scope_id)); for (const auto& stmt : ifstmt->false_statements) { gen_node(stmt); } m_stack.pop(); m_out << fmt::sprintf("L%d:\n", end_label); }
/* Find all labels. */ void scan_labels() { int addr; char *temp; label_init(); /* zero all labels */ temp = prog; /* save pointer to top of program */ /* if the first bas_token in the file is a label */ get_token(); if(bas_token_type==NUMBER) { strcpy(label_table[0].name,bas_token); label_table[0].p=prog; } find_eol(); do { get_token(); if(bas_token_type==NUMBER) { addr = get_next_label(bas_token); if(addr==-1 || addr==-2) { (addr==-1) ?serror(5):serror(6); } strcpy(label_table[addr].name, bas_token); label_table[addr].p = prog; /* current point in program */ } /* if not on a blank line, find next line */ if(bas_tok!=EOL) find_eol(); } while(bas_tok!=FINISHED); prog = temp; /* restore to original */ }
void jvmcodegen::gen_op_logical(const ast::node_ptr &node) { auto op = ast::to_op_logical(node); gen_node(op->left); gen_node(op->right); int true_label = get_next_label(); int end_label = get_next_label(); switch (op->op) { case tok::eq: m_out << fmt::sprintf("if_icmpeq L%d\n", true_label); break; case tok::ne: m_out << fmt::sprintf("if_icmpne L%d\n", true_label); break; case tok::ge: m_out << fmt::sprintf("if_icmpge L%d\n", true_label); break; case tok::le: m_out << fmt::sprintf("if_icmple L%d\n", true_label); break; case tok::gt: m_out << fmt::sprintf("if_icmpgt L%d\n", true_label); break; case tok::lt: m_out << fmt::sprintf("if_icmplt L%d\n", true_label); break; case tok::b_and: m_out << fmt::sprintf("iand\n"); m_out << fmt::sprintf("ifeq L%d\n", true_label); break; case tok::b_or: m_out << fmt::sprintf("ior\n"); m_out << fmt::sprintf("ifeq L%d\n", true_label); break; default: throw jvmcodegen_error(fmt::sprintf("Operacao logica invalida %s", token_name[op->op])); } m_out << fmt::sprintf("iconst_0\n"); m_out << fmt::sprintf("goto L%d\n", end_label); m_out << fmt::sprintf("L%d:\n", true_label); m_out << fmt::sprintf("iconst_1\n"); m_out << fmt::sprintf("L%d:\n", end_label); }