【问题标题】:ANTLR AST tree - searching for specific nodesANTLR AST 树 - 搜索特定节点
【发布时间】:2011-06-26 17:20:15
【问题描述】:

我有一个基于解析器语法构建的 AST。现在我想搜索树以确定树中是否存在特定节点。最好的方法是什么?

a) 编写一个带有相关动作的树语法,以遍历树以标记特定节点的存在。这样做的问题是我必须为我可能有兴趣搜索的每个节点类型编写一个树语法

b) 通过递归获取子节点并检查 Token.Text 以确定是否遇到特定节点类型,从而有问题地遍历 CommonTree。有任何可用的实用程序吗?

谢谢

维杰

【问题讨论】:

    标签: tree antlr grammar abstract-syntax-tree


    【解决方案1】:

    两者都是有效的选项。如果您要为其他目的(评估?)编写树语法,您可以简单地复制该语法并给它一个不同的名称,然后检查该树语法是否存在特定节点。

    AFAIK,没有可用于手动“行走”(一小部分)树 的实用程序,也没有太多需要它,因为它是一个微不足道的操作(伪代码):

    walk(Tree) {
    
      if Tree is null {
        return
      }
    
      inspect the Tree (node) type
    
      for every Child in Tree.getChildren() {
        walk(Child)
      }
    }
    

    编辑

    在仔细考虑之后,我想起了一些新功能,或多或少可以满足您的需求。您正在寻找的 ANTLR 术语是“树模式匹配”。

    引用:“树模式匹配器不是指定整个树的语法,而是让我们只关注那些我们关心的子树。--http://www.antlr.org/wiki/display/ANTLR3/Tree+pattern+matching”

    请注意,为此您需要 ANTLR 3.2+。

    【讨论】:

    • 微不足道,当然,但我很惊讶那里 不是 一个“实用程序”。我的程序转换工具有一组“FindFirstNode”、“WhereConditionDo”等函数,它们采用树、检测所需节点的谓词以及找到此类节点时要执行的动作函数。这些都非常方便。
    • @Ira,是的,考虑一下,我可以看到类似的东西的用途。请注意,在解析器语法中创建 AST 期间,使用 ANTLR 是可能重写/插入标记或树,但它不像您提到的那样灵活。
    • @Ira,请参阅编辑。毕竟这是可能的。
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多