Пример #1
0
void emit (astree* root) {

   switch (root->symbol) {

      case '='   :         emit_assign (root);                 break;
      case TOK_VARDECL :   emit_vardecl (root);                break;
      case TOK_NEWSTRING:  emit_alloc_string (root);           break;
      case TOK_NEWARRAY:   emit_alloc_array (root);            break;
      case '+':            emit_binop ("+", root);             break;
      case '-':            emit_binop ("-", root);             break;
      case '*':            emit_binop ("*", root);             break;
      case '/':            emit_binop ("/", root);             break;
      case '.':            emit_field_select (root);           break;
      case '!':            emit_unop ("!", root);              break;
      case TOK_ORD:        emit_unop ("(int)", root);          break;
      case TOK_CHR:        emit_unop ("(char)", root);         break;
      case TOK_LT:         emit_binop ("<", root);             break;
      case TOK_GT:         emit_binop (">", root);             break;
      case TOK_LE:         emit_binop ("<=", root);            break;
      case TOK_GE:         emit_binop (">=", root);            break;
      case TOK_EQ:         emit_binop ("==", root);            break;
      case TOK_NE:         emit_binop ("!=", root);            break;
      case TOK_NEG:        emit_unop ("-", root);              break;
      case TOK_POS:        emit_unop ("+", root);              break;
      case TOK_INDEX:      emit_index_select (root);           break;
      case TOK_RETURN:     emit_return (root);                 break;
      case TOK_RETURNVOID: emit_return (root);                 break;
      case TOK_CALL:       emit_call (root);                   break;
      case TOK_WHILE:      emit_while (root);                  break;
      case TOK_IFELSE:     emit_ifelse (root);                 break;
      case TOK_TRUE:       emit_boolcon (root);                break;
      case TOK_FALSE:      emit_boolcon (root);                break;
      default:                                                 break;
   }
}
Пример #2
0
Файл: gen.c Проект: irori/8cc
static void emit_expr(Node *node) {
    SAVE;
    switch (node->type) {
    case AST_LITERAL: emit_literal(node); return;
    case AST_STRING:  emit_literal_string(node); return;
    case AST_LVAR:    emit_lvar(node); return;
    case AST_GVAR:    emit_gvar(node); return;
    case AST_FUNCALL:
    case AST_FUNCPTR_CALL:
        emit_func_call(node);
        return;
    case AST_DECL:    emit_decl(node); return;
    case AST_CONV:    emit_conv(node); return;
    case AST_ADDR:    emit_addr(node->operand); return;
    case AST_DEREF:   emit_deref(node); return;
    case AST_IF:
    case AST_TERNARY:
        emit_ternary(node);
        return;
    case AST_FOR:     emit_for(node); return;
    case AST_WHILE:   emit_while(node); return;
    case AST_DO:      emit_do(node); return;
    case AST_SWITCH:  emit_switch(node); return;
    case AST_CASE:    emit_case(node); return;
    case AST_DEFAULT: emit_default(node); return;
    case AST_GOTO:    emit_goto(node); return;
    case AST_LABEL:
        if (node->newlabel)
            emit_label(node->newlabel);
        return;
    case AST_RETURN:  emit_return(node); return;
    case AST_BREAK:   emit_break(node); return;
    case AST_CONTINUE: emit_continue(node); return;
    case AST_COMPOUND_STMT: emit_compound_stmt(node); return;
    case AST_STRUCT_REF:
        emit_load_struct_ref(node->struc, node->ctype, 0);
        return;
    case AST_VA_START: emit_va_start(node); return;
    case AST_VA_ARG:   emit_va_arg(node); return;
    case OP_UMINUS:    emit_uminus(node); return;
    case OP_PRE_INC:   emit_pre_inc_dec(node, "add"); return;
    case OP_PRE_DEC:   emit_pre_inc_dec(node, "sub"); return;
    case OP_POST_INC:  emit_post_inc_dec(node, "add"); return;
    case OP_POST_DEC:  emit_post_inc_dec(node, "sub"); return;
    case '!': emit_lognot(node); return;
    case '&': emit_bitand(node); return;
    case '|': emit_bitor(node); return;
    case '~': emit_bitnot(node); return;
    case OP_LOGAND: emit_logand(node); return;
    case OP_LOGOR:  emit_logor(node); return;
    case OP_CAST:   emit_cast(node); return;
    case ',': emit_comma(node); return;
    case '=': emit_assign(node); return;
    case OP_LABEL_ADDR: emit_label_addr(node); return;
    case AST_COMPUTED_GOTO: emit_computed_goto(node); return;
    default:
        emit_binop(node);
    }
}