expression : expression ASSIGN expression { $$ = context->expression_assign($1, $3); } |
expression : expression ASSIGN expression { $$ = $1->assignment_factory($3); } |
expression * translator::expression_assign(expression *lhs, expression *rhs) { if (lhs is an integer variable) { return expression_assign_integer_factory( lhs->get address, rhs); } if (lhs is an integer array element) { return expression_assign_integer_factory( lhs->get address, rhs); } if (lhs is a string variable) { return expression_assign_string_factory( lhs->get address, rhs); } etc etc etc yyerror("left hand side of assignment inappropriate"); return new expression_error(); } | class expression { blah blah public: virtual expression *assignment_factory(expression *rhs); blah blah }; | expression * expression::assignment_factory(expression *rhs) { yyerror("left hand side of assignment inappropriate"); return new expression_error(); } |
No downcasts required. (Note similarity to
“switch (lhs->e_id)” in counter
example.)
|