Up, Prev Next

What's in a Name?

...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.