Up, Prev Next

The Assignment Problem: Left versus Right

There is a problem with the assignment expression.
expression
    : expression ASSIGN expression
        { $$ = context->expression_assignment($1, $3); }
    | IDENTIFIER
        { $$ = context->expression_identifier($1); }
    | etc etc
    ;

Let's play whack-a-mole.

void
translator::expression_assignment(expression *lhs, expression *rhs)
{
    expression_ldl *t1 = dynamic_cast<expression_ldl>(lhs)
    if (t1)
        return new expression_stl(t1->get_address(), rhs);
    expression_ldo *t2 = dynamic_cast<expression_ldo>(lhs)
    if (t2)
        return new expression_sro(t2->get_address(), rhs);

    etc etc etc

    yyerror("left hand side of assignment inappropriate");
    return new expression_error();
}
This is another imperative type-based dispatch.