2015-02-23 59 views
1

所以我想打印的过程中词法分析阶段要访问的语意,这里的方法是这样的代码:ANTLR游客正在返回一个空的解析树

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

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

file : (record)*; 

然后空解析树是一个语法正确的时候,没有record可以匹配。