Tree ANTLR AST树-搜索特定节点

Tree ANTLR AST树-搜索特定节点,tree,antlr,grammar,abstract-syntax-tree,Tree,Antlr,Grammar,Abstract Syntax Tree,我有一个基于语法分析器的AST。现在我想搜索树以确定树中是否存在特定节点。最好的方法是什么 a) 编写一个带有相关操作的树语法,以遍历树以标记特定节点的存在。问题是,我必须为我可能感兴趣搜索的每个节点类型编写一个树语法 b) 递归获取子节点并检查Token.Text以确定是否遇到特定节点类型,从而遍历CommonTree时出现问题。有没有这方面的实用程序 谢谢 Vijay都是有效的选项。如果您打算编写一个树语法用于其他目的(评估?),您可以简单地复制该语法并给它一个不同的名称,然后检查该树语法中

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

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

b) 递归获取子节点并检查Token.Text以确定是否遇到特定节点类型,从而遍历CommonTree时出现问题。有没有这方面的实用程序

谢谢


Vijay

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

顺便说一句,没有用于手动“行走”(树的一小部分)的实用程序,也没有太多的需要,因为这是一个简单的操作(伪代码):

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

引用:“树模式匹配器让我们只关注那些我们关心的子树,而不是指定整个树语法。”


请注意,您需要ANTLR 3.2+来完成此任务。

虽然微不足道,但如此普遍,我很惊讶没有“实用程序”。我的程序转换工具有一组“FindFirstNode”、“WhereConditionDo”等函数,这些函数采用树、谓词来检测所需节点,以及在找到此类节点时要执行的操作函数。这些东西很方便。@Ira,是的,想一想,我能看出它的用处。注意,ANTLR可以在解析器语法中创建AST期间重写/插入标记或树,但它没有您提到的那么灵活。@Ira,请参阅编辑。毕竟这是可能的。
walk(Tree) {

  if Tree is null {
    return
  }

  inspect the Tree (node) type

  for every Child in Tree.getChildren() {
    walk(Child)
  }
}