.\"
.\" UCSD p-System cross compiler
.\" Copyright (C) 2011, 2012 Peter Miller
.\"
.\" This program is free software; you can redistribute it and/or modify
.\" it under the terms of the GNU General Public License as published by
.\" the Free Software Foundation; either version 2 of the License, or (at
.\" you option) any later version.
.\"
.\" This program is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
.\" General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public License along
.\" with this program. If not, see
Up, Prev | Next |
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. |