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);
}
}发布于 2020-04-21 05:34:37
我想我已经看过这篇文章了,我没有足够的要点来“评论”,但让我先问一个问题;看起来你正在试图生成一个外部版本的AST,在137页上,你拿到了例子,并将它们重命名为你已经生成的语法。我将假设它的其余部分都在工作,否则你会遇到比这个更多的错误!这是我们的目标吗?您只是想要调用方法/类,还是想要完整的同构AST?
这取决于语法入口点。这在书中并不像看起来那么明显。您引用了functionDecl,它看起来像是Cymbol.g4中的一个条目,但在Java.g4中并不存在,所以我建议使用functionDecl而不是JavaParser.FunctionDeclContext它应该拉出正确的方法。我也要承认,我不知道exitCall会映射到什么。我自己也可以用到照明。
你是想要整个AST,还是只想要调用图?如果是整个测试,我认为您也可以使用enterEveryRule或ExitEveryRule,但确认会更好。
因此,首先重新生成您的语法,更改您的程序以引用.g4文件中的规则入口点,然后看看是否一切正常。
谢谢
https://stackoverflow.com/questions/61326718
复制相似问题