Lambda 同时使用antlr和DLR——AST转换

Lambda 同时使用antlr和DLR——AST转换,lambda,antlr3,abstract-syntax-tree,data-conversion,Lambda,Antlr3,Abstract Syntax Tree,Data Conversion,我有一个通过ANTLR生成的AST,我需要将其转换为与DLR兼容的(表达式树)。然而,似乎我不能使用树模式匹配器来实现这一点,因为表达式树在实例化时需要它们的子树(我无法获得)。什么样的解决方案最适合我使用?几年前我做了一件非常类似的事情——我没有构建DLR结构,但我构建了自己的表达式树结构,它在构建时也需要参数(以实现不变性) 当时,我使用的是ANTLR v2——我必须承认,我不熟悉新的v3语法,加上我不记得当时我是如何使用它的每一个细节——因此,我不想为您提供一个完整的示例,我只想告诉您我的

我有一个通过ANTLR生成的AST,我需要将其转换为与DLR兼容的(表达式树)。然而,似乎我不能使用树模式匹配器来实现这一点,因为表达式树在实例化时需要它们的子树(我无法获得)。什么样的解决方案最适合我使用?

几年前我做了一件非常类似的事情——我没有构建DLR结构,但我构建了自己的表达式树结构,它在构建时也需要参数(以实现不变性)

当时,我使用的是ANTLR v2——我必须承认,我不熟悉新的v3语法,加上我不记得当时我是如何使用它的每一个细节——因此,我不想为您提供一个完整的示例,我只想告诉您我的故事(不确定,它是否也适用于您的问题!):

首先,没有必要从AST构建我的结构。我只将ANLTR的AST构建器用作工具:除了AST节点本身之外,每个AST构建规则都可以返回一个对象。然后,可以在外部规则中将返回值用作构造函数的参数,依此类推。因此,结构是自动建立自下而上为您

注意,您在构建AST的同时构建最终结构(AST的构建只是为了确保语法规则,可以扔掉)。这种方法非常可靠,甚至比首先构建AST,然后转换它还要快!但它仍然利用了AST解析器的功能(与仅使用普通解析器/词法分析器相反)。如果你也需要AST,就把它保存在某个地方

但是,如果您想运行一个完成的AST—我想您可以使用任何编程例程来完成—只需确保它能够自下而上构建您的结果


希望这对你有所帮助

我担心我可能必须手动进行AST转换,但是我将研究如何使用AST构建器来创建AST的DLR版本。谢谢如果您有任何问题,请随时提问!我没有我的旧代码,但当被问到一些具体的问题时,也许我能回忆起其中的一些:-)我在ANTLR v2文档中找到了相应的部分:我的代码看起来与该页面上的CalcTreeWalker相似(尽管有点复杂)。而不是
r=a+b我使用了类似
r=新产品(a,b)的东西