ANTLR AST树 - 搜索特定节点

时间:2011-06-26 17:20:15

标签: tree antlr grammar abstract-syntax-tree

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

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

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

由于

维杰

1 个答案:

答案 0 :(得分:2)

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

AFAIK,没有可用于手动“行走”(一小部分)树的实用工具,也不需要它,因为它是一个简单的操作(伪代码): < / p>

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+。