【发布时间】:2010-02-24 20:28:06
【问题描述】:
我有一个通过 ANTLR 生成的 AST,我需要将其转换为与 DLR 兼容的一个(表达式树)。但是,似乎我不能为此使用树模式匹配器,因为表达式树在实例化时需要它们的子树(我无法获得)。哪种解决方案最适合我使用?
【问题讨论】:
标签: lambda antlr3 abstract-syntax-tree data-conversion
我有一个通过 ANTLR 生成的 AST,我需要将其转换为与 DLR 兼容的一个(表达式树)。但是,似乎我不能为此使用树模式匹配器,因为表达式树在实例化时需要它们的子树(我无法获得)。哪种解决方案最适合我使用?
【问题讨论】:
标签: lambda antlr3 abstract-syntax-tree data-conversion
几年前我做过非常相似的事情——我没有构建 DLR 结构,但我构建了自己的表达式树结构,这也需要在构建时提供参数(以实现不变性)。
当时,我使用的是 ANTLR v2 - 我必须承认,我不熟悉新的 v3 语法,而且我不记得我当时是如何做到的所有细节 - 所以我没有提供给你通过一个完整的例子,我会试着告诉你我的故事(不确定,如果它也适用于你的问题!):
首先,没有必要从 AST 构建我的结构。我只使用了 ANLTR 的 AST 构建器作为工具:除了 AST 节点本身之外,每个 AST 构建规则都可以返回一个对象。然后可以在外部规则中将返回值用作构造函数的参数,依此类推。因此,该结构会自动为您自下而上构建!
IOW,你在构建 AST 的同时构建最终结构(AST 只是为了确保语法规则而构建的,可以丢弃。)这种方法非常可靠,甚至比第一种更快构建 AST,然后对其进行改造!但它仍然利用了 AST 解析器的强大功能(而不是仅仅使用普通的 Parser/Lexer)。如果您也需要 AST - 只需将其保存在某个地方即可。
如果您想要完成一个完成的 AST - 我想您可以使用任何编程例程来执行此操作 - 只需确保它可以自下而上地构建您的结果!
希望这在某种程度上有所帮助!
【讨论】:
r=a+b;,我使用了r = new Product(a, b);