我为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
类型的情况)。这似乎不正确,我想知道我是否错过了使用泛型的机会。