访客设计模式的口译员

时间:2015-07-16 15:27:27

标签: c# oop design-patterns visitor

我为LISP编程语言的一个子集编写了一个解析器,现在想编写一个解释器。我被告知访问者模式是可取的,因为它有助于保持语法类的整洁与评估逻辑。

我在编写实际的“accept”和“visit”方法时遇到了麻烦,特别是指定了返回类型。在我的语法类中,所有内容都是IExpression。以下是我解析输入的一些表达式:

public interface IExpression
{
}

public class Number : IExpression
{
    public Number(double x)
    {
        Val = x;
    }

    public readonly double Val;
}

public class Bool : IExpression
{
    public Bool(bool b)
    {
        Val = b;
    }

    public readonly bool Val;
}

public class Definition : IExpression
{
    public Definition(string name, IExpression expr)
    {
        Name = name; Expr = expr;
    }

    public readonly string Name;
    public readonly IExpression Expr;
}

public class Conditional : IExpression
{
    public Conditional(IExpression test,
        IExpression trueBranch, IExpression falseBranch)
    {
        Test = test; TrueBranch = trueBranch; ElseBranch = falseBranch;
    }

    public readonly IExpression Test;
    public readonly IExpression TrueBranch;
    public readonly IExpression ElseBranch;
}

public class Add : NumericExpression
{
    public Add(IExpression x, IExpression y)
    {
        X = x; Y = y;
    }

    public readonly IExpression X;
    public readonly IExpression Y;
}

这是访客界面。

public interface IVisitor
{
    double Visit(Add add)
}

我现在应该如何“访问”Add节点?如果我将public double Accept(IVisitor v)添加到IExpression界面,则必须执行所有操作 “接受”表示双打,即使表达式永远不会产生双精度(例如,我的Bool类型的情况)。这似乎不正确,我想知道我是否错过了使用泛型的机会。

0 个答案:

没有答案