2009-10-16 54 views
0
numberrange returns [String value] 
    : numberrangesub 
     { 
     String numberRange = ($numberrangesub.text); 
     String [] v = numberRange.split(","); 
     if (Integer.parseInt(v[0].trim()) < Integer.parseInt(v[1].trim())) $value =numberRange; 
     else throw new RecognitionException(); 
     } 
    ; 

請注意上面的ANTLR代碼。在這個我想拋出一個用戶友好的錯誤消息,如"from value should be less than to value in BETWEEN clause"。 我期待像這樣RecognitionException("from value should be less than to value in BETWEEN clause");但antlr並沒有像上面那樣接受。使用antlr3獲取用戶定義的錯誤消息

在我正在調用Antlr生成的java類的java類中。我正在處理如下。

try 
{ 
    parser.numberRangeCheck(); 
} 
catch (RecognitionException e) 
{ 
    throw createException("Invalid Business logic syntax at " + parser.getErrorHeader(e) + ", " + parser.getErrorMessage(e, null), Level.INFO, logger); 
} 

任何幫助將appriciated。

+0

你可以在ANTLR代碼上使用代碼格式化程序嗎?這會讓閱讀變得更容易。 – Jorn 2009-10-17 07:44:29

+0

numberrange returns [String value] :numberrangesub { String numberRange =($ numberrangesub.text); String [] v = numberRange.split(「,」); if(Integer.parseInt(v [0] .trim()) Ashok 2009-10-20 11:12:32

+0

我正在使用代碼格式化程序,但它張貼後顯示無格式。我不知道它爲什麼會發生? – Ashok 2009-10-20 11:14:01

回答

0

爲什麼不簡單地拋出一個RuntimeException與您的自定義錯誤消息?

// ... 
else throw new RuntimeException("from value should be less than to value in BETWEEN clause"); 
// ... 
0

至於特倫斯在「的德網絡nitive ANTLR參考」中寫道error chapter excerpt

爲了避免迫使僅英文錯誤消息和一般使 事情靈活的越好,識別不用字符串消息創建異常 對象。相反,它會跟蹤生成錯誤所需的信息。

所以沒有錯誤信息提供給RecognitionError的構造函數。但是你可以定義識別器的附加字段上RecognitionError處理顯示用戶友好的錯誤消息來保存:

numberrange returns [String value] 
    : numberrangesub 
     { 

     String numberRange = ($numberrangesub.text); 
     String [] v = numberRange.split(","); 
     if (Integer.parseInt(v[0].trim()) < Integer.parseInt(v[1].trim())) 
      $value = numberRange; 
     else { 
      this.errorMessage = "from value should be less than to value in BETWEEN clause"; 
      throw new RecognitionException(this.input); 
     } 

     } 
    ; 

然後重寫getErrorMessage方法:

public String getErrorMessage(RecognitionException e, String[] tokenNames) { 
    String msg = this.errorMessage; 
    // ... 
} 

的使用方法類似釋義機制解釋在同一節錄中。

相關問題