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文件中的规则入口点,然后查看其是否全部正常。
谢谢