我应该使用解释器还是访问者设计模式?
我认为这些名称给出了提示;-)
访问者对 AST 的一般操作很有用,但对于执行单一功能(执行/解释),您只需要一种方法,因此需要解释器模式。
这是一个非常简单的示例(但实际上并没有比这更复杂,即使对于复杂的解释器也是如此):
// Holds function scope etc.
class Context {}
abstract class Node {
public abstract object Execute(Context ctx);
}
class Number : Node {
private readonly int x;
public Number(int x) { this.x = x; }
public override object Execute(Context ctx) { return x; }
}
class Addition : Node {
private readonly Node left, right;
public Addition(Node left, Node right) {
this.left = left;
this.right = right;
}
public override object Execute(Context ctx) {
// Verification omitted: do the nested expressions evaluate to a number?
return (int) left.Execute(ctx) + (int) right.Execute(ctx);
}
}
......你有它。一个知道加法的简单解释器。这是一个使用示例:
var ast = new Addition(new Number(23), new Number(42));
Console.WriteLine("Result = {0}", ast.Execute(new Context()));