|
|
expression * translator::expression_plus(expression *lhs,
expression *rhs) {
switch (std::pair(lhs->e_id, rhs->e_id))
{
case std::pair(TYPE_INTEGER, TYPE_INTEGER):
return new expression_add_integer(lhs, rhs);
case std::pair(TYPE_REAL, TYPE_INTEGER):
rhs = cast_int_real_factory(rhs);
return new expression_add_real(lhs, rhs);
case std::pair(TYPE_INTEGER, TYPE_REAL):
lhs = cast_int_real_factory(lhs);
return new expression_add_real(lhs, rhs);
case std::pair(TYPE_REAL, TYPE_REAL):
return new expression_add_real(lhs, rhs);
}
error("invalud additon expression");
return new expression_error(); } |
class translator {
blah blah private:
binary_dispatch op_add;
blah blah };
void translator::translator() {
blah blah
op_plus.push_back(type_integer::is_a, type_integer::is_a,
&translator::expression_plus_integer_factory);
op_plus.push_back(type_real::is_a, type_real::is_a,
&translator::expression_plus_real_factory);
op_plus.push_back(type_integer::is_a, type_real::is_a,
&translator::expression_integer_plus_real);
blah blah }
expression * translator::expression_plus(expression *lhs,
expression *rhs) {
return op_plus.dispatch(lhs, rhs); }
expression * translator::expression_integer_plus_real(expression
*lhs, expression *rhs) {
lhs = cast_int_real_factory(lhs);
return expression_plus_real_factory(lhs, rhs);
} |
| Problem:
we replaced those id things with vptrs.
|