所以我试图打印在词法分析阶段正在访问的词位,这是执行此操作的方法的代码:
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/