java - antlr 访问者返回一个空的解析树

标签 java parsing compiler-construction antlr lexer

所以我试图打印在词法分析阶段正在访问的词位,这是执行此操作的方法的代码:

public void parse(String inputFile) {
    InputStream is = System.in;
    if (inputFile != null)
        try {
            is = new FileInputStream(inputFile);
            ANTLRInputStream input = new ANTLRInputStream(is);
            PARVALexer lexer = new PARVALexer(input);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            PARVAParser parser = new PARVAParser(tokens);

            ParseTree tree = parser.prog(); // parse


            PARVAnalyzer visitor = new PARVAnalyzer();

            visitor.visit(tree);
        } catch (Exception e) {

            e.printStackTrace();
        }

}

如果我打印 tokens ,我会得到输入文件中所有已识别词位的正确输出,但如果我打印 tree ,输出只是 [ ],因此方法 visit(tree) 没有执行任何操作... 我可能做错了什么?

最佳答案

很可能您的解析器无法匹配输入中的任何内容。 ANTLR 解析器不会尝试处理整个输入,除非您的语法规则强制它们(例如,如果您的规则中有 EOF)。检查 stderr 中的解析器消息,或尝试通过 grun 运行您的输入以查看解析器看到的内容。请记住,如果您的语法规则允许空输入,那么它就是正确的结果,比如说您的开始规则是这样的

file : (record)*;

当没有记录可以匹配时,空解析树是语法上正确的结果。

关于java - antlr 访问者返回一个空的解析树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28682373/

相关文章:

Javafx:如何获取单击的文本元素的ID

java - UtteranceProgressListener 不会调用函数

c# - 解析泛型时区分 ">>"和 ">"

c++ - 在 CMake 中设置默认编译器

c++ - 使用纯 C++ 编译器与 Visual C++

java - 将视频从一个设备流式传输到另一个设备时,谁是服务器,谁是客户端?

python - Python 解析器如何处理缩进?

java - 帮助解析简单的JSON(使用JSON for JAVA ME)

c++ - 有一些方法可以使用 g++ C++ 编译器将错误日志打印到外部文件吗? (C++)

java - 如何访问继承中的私有(private)字段