使用AST中的c#制作一个真正的解释器

时间:2012-12-21 10:55:12

标签: c# interpreter abstract-syntax-tree

我知道还有其他关于编译器/解释器技术的问题以及非常好的代码,例如IronPythonJurassic。 对我来说很清楚如何从源代码构建AST(抽象语法树),编写一个顶级的解析器(目前我更喜欢编写而不是使用代码生成工具)。

当我用作解释器时,我正在尝试学习的大多数资源使用像Reflection.Emit这样的API来编译程序。 现在,我想知道构建一个真正的解释器的最佳实践,该解释器不能编译为.NET VM。

获得AST后,我该如何执行代码?我应该使用口译员或访客设计模式吗?或做一些不同的事情?什么是最好或规范的方式?

我知道已经有question like这个了,但如果可能的话,我喜欢更多的信息,更具体的.NET / C#实现。

关心,贾科莫

1 个答案:

答案 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()));
相关问题