作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如标题所说,在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
节点的子节点的子节点,其子类型为 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
和 name1
我不想一层一层地寻找 children 。 emmm,有什么方便的方法吗?
最佳答案
对于给定的解析树,可以使用 ANTLR4's XPath implementation 轻松查找特定子节点(在任何嵌套级别)。 .
您可以从调用的解析器规则返回的完整解析树或特定子树的监听器/访问者方法中触发搜索,例如:
List<ParseTreeMatch> matches = XPath.findAll(ctx, "//localVariableDeclaration", parser);
返回的匹配是 LocalVariableDeclarationContext
的实例(如果有匹配的话)。
注意:链接页面描述了两个搜索实用程序:解析树匹配和 XPath,它们可以单独使用,也可以一起使用。
关于java - 如何在ANTLR中找到children上下文的children?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59100712/
我是一名优秀的程序员,十分优秀!