Java 如何找到儿童的孩子';ANTLR中的上下文是什么?

Java 如何找到儿童的孩子';ANTLR中的上下文是什么?,java,antlr,antlr4,Java,Antlr,Antlr4,正如标题所说,在ANTLR中侦听或访问节点时,是否有方法查找子节点的子节点 例如:(使用grammars-v4-javalexer和解析规则) 首先,我把一个java文件放到语法树中 grunjava编译单元-gui Example.Java //Example.java 公开课范例{ String name=“test”; 无效调用(){ String name1=“测试”; } } 语法树是 然后,我尝试使用java扩展baseListerner以侦听enterClassDeclara

正如标题所说,在ANTLR中侦听或访问节点时,是否有方法查找子节点的子节点

例如:(使用grammars-v4-javalexer和解析规则)

首先,我把一个java文件放到语法树中

grunjava编译单元-gui Example.Java
//Example.java
公开课范例{
String name=“test”;
无效调用(){
String name1=“测试”;
}
}
语法树是

然后,我尝试使用java扩展baseListerner以侦听
enterClassDeclaration
节点。因此,我可以获得
ClassDeclarationContext
节点。我想找到子类型为
LocalDeclarationContext
的子节点的
ClassDeclarationContext
节点的子节点

在本例中:

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);
    }
}
公共类MyListener扩展了JavaParserBaseListener{
@凌驾
公共无效enterClassDeclaration(JavaParser.ClassDeclarationContext ctx){
//通过ctx查找children的孩子
列表上下文=findChildContextBy(ctx,LocalVariableDeclarationContext.class);
super.enterClassDeclaration(ctx);
}
}
变量
上下文
应该有两个元素<代码>名称和
名称1


我不想一层一层地找到孩子们。emmm,有什么方便的方法吗?

对于给定的解析树,可以很容易地使用查找特定的子节点(在任何嵌套级别)

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

List<ParseTreeMatch> matches = XPath.findAll(ctx, "//localVariableDeclaration", parser);
List matches=XPath.findAll(ctx,“//localvariabledesclaration”,解析器);
返回匹配是
LocalVariableDeclarationContext
的实例(如果匹配)


注意:链接页面描述了两个搜索实用程序,parse tree matching和XPath,它们可以单独使用,也可以一起使用。

为什么不改为侦听
enterLocalDeclaration
?是的,这是侦听指定节点上下文的好方法。这意味着我需要重写specifyevent方法。但我想知道是否有一种方法或API可以找到儿童的孩子。就像问题的描述<代码>findChildContextBy(ctx,LocalVariableDeclarationContext.class)。我只需要传递一个上下文类param,而不是重写不同的事件方法。或者这种方式不好……我认为将解析树匹配和XPath结合使用是一个不错的选择。谢谢,迈克。