2015-02-23 31 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可以匹配。