【问题标题】:Using antlr and the DLR together -- AST conversionantlr 和 DLR 一起使用——AST 转换
【发布时间】:2010-02-24 20:28:06
【问题描述】:

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

【问题讨论】:

    标签: lambda antlr3 abstract-syntax-tree data-conversion


    【解决方案1】:

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

    当时,我使用的是 ANTLR v2 - 我必须承认,我不熟悉新的 v3 语法,而且我不记得我当时是如何做到的所有细节 - 所以我没有提供给你通过一个完整的例子,我会试着告诉你我的故事(不确定,如果它也适用于你的问题!):

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

    IOW,你在构建 AST 的同时构建最终结构(AST 只是为了确保语法规则而构建的,可以丢弃。)这种方法非常可靠,甚至比第一种更快构建 AST,然后对其进行改造!但它仍然利用了 AST 解析器的强大功能(而不是仅仅使用普通的 Parser/Lexer)。如果您也需要 AST - 只需将其保存在某个地方即可。

    如果您想要完成一个完成的 AST - 我想您可以使用任何编程例程来执行此操作 - 只需确保它可以自下而上地构建您的结果!

    希望这在某种程度上有所帮助!

    【讨论】:

    • 我担心我可能不得不手动进行 AST 转换,但是我会考虑使用 AST 构建器来制作 DLR 版本的 AST。谢谢!
    • 如果您在此过程中有任何问题 - 请随时提问!我没有可用的旧代码,但当被问及具体问题时,也许我能回忆起其中的一些:-)
    • 我刚刚在 ANTLR v2 文档中找到了相应的部分:antlr2.org/doc/sor.html 我的代码看起来与该页面上的 CalcTreeWalker 相似(虽然有点复杂)。而不是r=a+b;,我使用了r = new Product(a, b);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多