Not uncommon C implemntation... | Desired C++ implementation... | void expression_plus_compile::generate_code() { lhs->generate_code(); rhs->generate_code(); switch (PAIR(lhs->get_type(), rhs->get_type())) { case PAIR(TYPE_INTEGER, TYPE_INTEGER): emit(OP_ADI); break; case PAIR(TYPE_REAL, TYPE_INTEGER): emit(OP_FLT); emit(OP_ADR); break; case PAIR(TYPE_INTEGER, TYPE_REAL): emit(OP_FLO); emit(OP_ADR); break; case PAIR(TYPE_REAL, TYPE_REAL): emit(OP_ADR); break; } } | void expression_plus_integer_compile::generate_code() { lhs->generate_code(); rhs->generate_code(); emit(OP_ADI); } // and take care of the implict casts // somewhere else, too. void expression_plus_real_compile::generate_code() { lhs->generate_code(); rhs->generate_code(); emit(OP_ADR); } |
But how do we get there?