|
|
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.)
|