2013-10-02 36 views
0

基本上,我擴展了BaseErrorListener,並且我需要知道錯誤何時是語義以及何時是語法。所以我想要以下給我一個失敗的謂詞異常,但我得到一個NoViableAltException而不是(我知道計數正在工作,因爲我可以打印出things的值,它是正確的)。有沒有辦法讓我可以重新做它我想做的事?在我的下面的例子中,如果我們沒有結束6 things,我希望那裏有一個失敗的謂詞異常。在ANTLR4中強制語義錯誤(失敗謂詞)

grammar Test; 

@parser::members { 
    int things = 0; 
} 
. 
. 
. 
samplerule : THING { things++; } ; 
. 
. 
. 
// Want this to be a failed predicate instead of NoViableAltException 
anotherrule : ENDTOKEN { things == 6 }? ; 
. 
. 
. 

我已經得到妥善未能斷言例外具有以下(對於不同的情景):

somerule : { Integer.valueOf(getCurrentToken().getText()) < 256 }? NUMBER ; 
. 
. 
. 
NUMBER : [0-9]+ ; 

回答

0

由於280Z28's答案和明顯的事實,謂詞不應該用於我想要做的事情,我走了一條不同的路線。

如果你知道你在找什麼,ANTLR4的文件實際上是非常有用的 - 訪Parser.getCurrentToken()的文件和閒逛進一步看到更多的你可以通過下面我做執行。

我的司機最終看上去像下面這樣:

// NameOfMyGrammar.java 
public class NameOfMyGrammar { 

    public static void main(String[] args) throws Exception { 

     String inputFile = args[0]; 

     try { 
      ANTLRInputStream input = new ANTLRFileStream(inputFile); 

      NameOfMyGrammarLexer lexer = new NameOfMyGrammarLexer(input); 

      CommonTokenStream tokens = new CommonTokenStream(lexer); 

      MyCustomParser parser = new MyCustomParser(tokens); 

      try { 
       // begin parsing at "start" rule 
       ParseTree tree = parser.start(); 
       // can print out parse tree if you want.. 
      } catch (RuntimeException e) { 
       // Handle errors if you want.. 
      } 
     } catch (IOException e) { 
      System.err.println("Error: " + e); 
     } 
    } 

    // extend ANTLR-generated parser 
    private static class MyCustomParser extends NameOfMyGrammarParser { 

     // Constructor (my understanding is that you DO need this) 
     public MyCustomParser(TokenStream input) { 
      super(input); 
     } 

     @Override 
     public Token getCurrentToken() { 
      // Do your semantic checking as you encounter tokens here.. 
      // Depending on how you want to handle your errors, you can 
      // throw exceptions, print out errors, etc. 

      // Make sure you end by returning the current token 
      return _input.LT(1); 
     } 
    } 
} 
0

在ANTLR 4,謂語應可以在實際的情況你的輸入會導致兩種不同的可能的分析樹(模糊語法),而缺省的處理會產生錯誤的分析樹。您應該創建一個包含您的源語義驗證邏輯的偵聽器或訪問者實現。