我知道还有其他关于编译器/解释器技术的问题以及非常好的代码,例如IronPython到Jurassic。 对我来说很清楚如何从源代码构建AST(抽象语法树),编写一个顶级的解析器(目前我更喜欢编写而不是使用代码生成工具)。
当我用作解释器时,我正在尝试学习的大多数资源使用像Reflection.Emit这样的API来编译程序。 现在,我想知道构建一个真正的解释器的最佳实践,该解释器不能编译为.NET VM。
获得AST后,我该如何执行代码?我应该使用口译员或访客设计模式吗?或做一些不同的事情?什么是最好或规范的方式?
我知道已经有question like这个了,但如果可能的话,我喜欢更多的信息,更具体的.NET / C#实现。
关心,贾科莫
答案 0 :(得分:3)
我应该使用口译员或访客设计模式吗?
我认为这些名字给出了一个提示; - )
访问者有利于AST的一般操作,但是为了执行单一函数(执行/解释),您只需要一个方法,因此需要解释器模式。
这是一个非常简单的例子(但它确实没有那么复杂,即使是复杂的解释器):
// Holds function scope etc.
class Context { … }
abstract class Node {
public abstract object Execute(Context ctx);
}
class Number {
private readonly int x;
public Number(int x) { this.x = x; }
public object Execute(Context ctx) { return x; }
}
class Addition {
private readonly Node left, right;
public Addition(Node left, Node right) {
this.left = left;
this.right = right;
}
public 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()));