如何在ANTLR中找到具有儿童情境的孩子?

时间:2019-11-29 07:46:05

标签: java antlr antlr4

正如标题所述,在ANTLR中侦听或访问节点时是否可以找到子节点的子节点。

例如:(使用grammars-v4-java词法分析器和解析规则)

首先,我将一个Java文件添加到语法树中。

grun Java compilationUnit  -gui Example.java
// Example.java
public class Example {
    String name = "test";
    void call(){
        String name1 = "test";
    }
}

并且语法树是

Example.java grammar tree.png(picture)

然后,我尝试使用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); } } 应该包含两个元素。 contextsname

我不想一层一层地找到孩子。嗯,有没有方便的方法?

1 个答案:

答案 0 :(得分:1)

对于给定的分析树,使用ANTLR4's XPath implementation查找特定子节点(在任何嵌套级别)都很容易。

您可以从被调用的解析器规则返回的完整解析树中或特定子树的侦听器/访问者方法中触发搜索,例如:

List<ParseTreeMatch> matches = XPath.findAll(ctx, "//localVariableDeclaration", parser);

返回的匹配项是LocalVariableDeclarationContext的实例(如果有匹配项)。

注意:链接的页面描述了两个搜索实用程序,即解析树匹配和XPath,它们可以单独使用或一起使用。