正如标题所述,在ANTLR中侦听或访问节点时是否可以找到子节点的子节点。
例如:(使用grammars-v4-java词法分析器和解析规则)
首先,我将一个Java文件添加到语法树中。
grun Java compilationUnit -gui Example.java
// Example.java
public class Example {
String name = "test";
void call(){
String name1 = "test";
}
}
并且语法树是
然后,我尝试使用Java扩展baseListerner以监听enterClassDeclaration
节点。这样我就可以得到ClassDeclarationContext
节点。我想找到子类型为ClassDeclarationContext
的{{1}}节点的子项。
在此示例中:
LocalDeclarationContext
变量public class MyListener extends JavaParserBaseListener {
@Override
public void enterClassDeclaration(JavaParser.ClassDeclarationContext ctx) {
// find the children of children by ctx
List<ParserRuleContext> contexts = findChildContextBy(ctx, LocalVariableDeclarationContext.class);
super.enterClassDeclaration(ctx);
}
}
应该包含两个元素。 contexts
和name
我不想一层一层地找到孩子。嗯,有没有方便的方法?
答案 0 :(得分:1)
对于给定的分析树,使用ANTLR4's XPath implementation查找特定子节点(在任何嵌套级别)都很容易。
您可以从被调用的解析器规则返回的完整解析树中或特定子树的侦听器/访问者方法中触发搜索,例如:
List<ParseTreeMatch> matches = XPath.findAll(ctx, "//localVariableDeclaration", parser);
返回的匹配项是LocalVariableDeclarationContext
的实例(如果有匹配项)。
注意:链接的页面描述了两个搜索实用程序,即解析树匹配和XPath,它们可以单独使用或一起使用。