antlr visitor返回一个空的解析树

时间:2015-02-23 20:01:49

标签: 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();
        }

}

如果我打印标记,我会在输入文件中得到所有已识别词位的正确输出,但如果我打印,则输出只是 [] ,所以方法访问(树)没有做任何事...... 我可能做错了什么?

1 个答案:

答案 0 :(得分:1)

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

var duration = buffer.duration;

然后,当没有file : (record)*; 可以匹配时,空的解析树是语法上正确的结果。