首页 > 解决方案 > 无法解析 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);
            }
        }

标签: antlr

解决方案


我想我看过这个,我没有足够的分数来“评论”,但我先问一个问题;看起来您正在尝试在第 137 页上生成 AST 的外部版本,您获取了示例并将它们重命名为您已经生成的语法。我会假设它的其余部分正在工作,否则你会遇到比这个更多的错误!那是目标吗?你只是在调用方法/类之后还是在完整的同质 AST 之后?

这取决于语法入口点。这在书中并不像看起来那么明显。您引用了 functionDecl,它看起来是 Cymbol.g4 中的一个条目,但在 Java.g4 中不存在所以我建议使用 JavaParser.classOrInterfaceDeclarationContext 而不是 JavaParser.FunctionDeclContext。它应该拉起正确的方法。我还要承认我不知道 exitCall 会映射到什么。我可以自己使用照明。

您是在整个 AST 之后还是仅在调用图之后?如果是整个 AST,我认为您也可以使用 enterEveryRule 或 ExitEveryRule,但确认会很好。

因此,首先重新生成语法,更改程序以引用 .g4 文件中的规则入口点,然后查看是否一切正常。

谢谢


推荐阅读