所以我试图在词法分析阶段打印正在访问的词汇,这是这样做的方法的代码:
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();
}
}
如果我打印标记,我会在输入文件中得到所有已识别词位的正确输出,但如果我打印树,则输出只是 [] ,所以方法访问(树)没有做任何事...... 我可能做错了什么?
答案 0 :(得分:1)
很可能你的解析器无法匹配输入中的任何内容。 ANTLR解析器不会尝试处理整个输入,除非您的语法规则强制它们(例如,如果您的规则中有EOF。)检查stderr是否有解析器消息,或尝试通过grun运行输入以查看解析器看到的内容。请记住,如果你的语法规则允许空输入,那么它是正确的结果,比如说你的开始规则是否类似
var duration = buffer.duration;
然后,当没有file : (record)*;
可以匹配时,空的解析树是语法上正确的结果。