...imperative type-based dispatch |
... facility of the C++ language |
expression
: NAME
{ $$ = context->name_expression($1); }
| etc etc etc
;
|
class symbol
{
public:
virtual expression *name_expression_factory(const char *name);
};
|
expression *
translator_compiler::name_expr_factory(const char *name) {
symbol *sp = lookup(name);
if (!sp) {
yyerror("name
return new expr_error();
}
|
expression *
translator::name_expr_factory(const char *name) {
symbol *sp = lookup(name);
if (!sp) {
yyerror("name
return new expr_error();
}
|
|
return sp->name_expression_factory() const;
}
|
const symbol_global *test1 =
dynamic_cast<const symbol_global *>(sp);
if (test1)
return new expression_ldo(sp->get_address());
|
expression *
symbol_global::name_expression_factory()
const
{
return new expression_ldo(get_address());
}
|
yyerror("can't use name \"%s\" here", sp->get_name());
return new expression_error();
}
|
expression *
symbol::name_expression_factory()
{
yyerror("can't use name \"%s\" here", get_name());
return new expression_error();
}
|
Now we have a factory factory factory.
|
|