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);
}
Esempio n. 2
0
/* 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);
}