Back Next

Method

To get the assignment correct, we assume an idenitifier is on the right hand side (that happens more often), and to turn it into a left hand side if needed. But there is a right way and a wrong way....
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.)