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();
}