antlr - 无法解析 JavaParser
问题描述
JavaParser.CallContext 和 JavaParser.FunctionDeclContext 似乎无法解决。这是在权威 antlr 参考中的第 139 页之后建模的。我错过了一个图书馆吗?
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.misc.MultiMap;
import org.antlr.v4.runtime.misc.OrderedHashSet;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.*;
import org.stringtemplate.v4.ST;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Set;
static class FunctionListener extends JavaBaseListener {
Graph graph = new Graph();
String currentFunctionName = null;
public void enterFunctionDecl(JavaParser.FunctionDeclContext ctx) {
currentFunctionName = ctx.ID().getText();
graph.nodes.add(currentFunctionName);
}
public void exitCall(JavaParser.CallContext ctx) {
String funcName = ctx.ID().getText();
// map current function to the callee
graph.edge(currentFunctionName, funcName);
}
}
解决方案
我想我看过这个,我没有足够的分数来“评论”,但我先问一个问题;看起来您正在尝试在第 137 页上生成 AST 的外部版本,您获取了示例并将它们重命名为您已经生成的语法。我会假设它的其余部分正在工作,否则你会遇到比这个更多的错误!那是目标吗?你只是在调用方法/类之后还是在完整的同质 AST 之后?
这取决于语法入口点。这在书中并不像看起来那么明显。您引用了 functionDecl,它看起来是 Cymbol.g4 中的一个条目,但在 Java.g4 中不存在所以我建议使用 JavaParser.classOrInterfaceDeclarationContext 而不是 JavaParser.FunctionDeclContext。它应该拉起正确的方法。我还要承认我不知道 exitCall 会映射到什么。我可以自己使用照明。
您是在整个 AST 之后还是仅在调用图之后?如果是整个 AST,我认为您也可以使用 enterEveryRule 或 ExitEveryRule,但确认会很好。
因此,首先重新生成语法,更改程序以引用 .g4 文件中的规则入口点,然后查看是否一切正常。
谢谢
推荐阅读
- asp.net-mvc - Asp.net core 表单总是返回 null
- google-apps-script - 在 Google Apps 脚本中创建 Geochart 时“请求的地图不存在”
- c++ - 如何确保可变元组中的类型相同?
- javascript - 如何在工具栏中隐藏/不显示 PDF 标题
- ios - UIAlertController 内的键盘未关闭
- python - 尝试使用 Python 打开 Photoshop 时出现 com_error -2146959355
- git - 新的工作树和分支有什么区别?
- javascript - 在节点获取之前将字符串与文件数据进行比较的替代解决方案
- docker - 如何控制在 Kubernetes 上的 Job 中运行的容器数量
- spring-boot - Spring Boot v2.3.4.RELEASE | 默认 logback 设置 | 如何禁用每日日志轮换