2013-03-13 45 views
1

考慮我們嘗試將某些不正確的輸入文本提供給某些語法(例如,包含某些未知令牌的文本)。在解釋過程中,我們將在圖中看到NoViableAltException在Java和ANTLRWorks調試器中捕獲ANTLR的NoViableAltException

UPD:出現有兩種情況時,此異常:

1)意外利用一些已知的令牌,在這種情況下,我們會收到類似line 5:36 no viable alternative at input ','

2)使用未知令牌類型。例如語法不知道任何有關令牌的內容,它以@符號開頭。我們正在嘗試用這種令牌將文本提供給我們的語法。

不幸的是在情況下(2)不會拋出此異常既不在ANTLRWorks調試器中,也不在生成的Java代碼中;但只有在ANTLRWorks解釋者的結果圖中才能看到。

我試過也下列標準的代碼添加到我的語法:

@parser::members { 
    private IErrorReporter errorReporter = null; 
    public void setErrorReporter(IErrorReporter errorReporter) { 
     this.errorReporter = errorReporter; 
    } 
    public void emitErrorMessage(String msg) { 
     errorReporter.reportError(msg); 
    } 
} 
@lexer::members { 
    ... the same code as above ... 
} 

這種結構成功地抓到解析式(1)(:line 5:36 no viable alternative at input ','例如意想不到使用令牌的錯誤)的錯誤。但是,如果不可行的輸入與未知的標記語法分析器只生成children == null頂部CommonTree對象沒有任何錯誤報告。我正在使用antlr 3.5

問題:有可能在生成的Java代碼中描述的情況下捕獲NoViableAltException以及如何?

回答

0

您需要在您的詞法分析器中添加以下內容作爲最後的規則。它將爲無效字符創建一個標記,並將其發送給錯誤將被正確報告的解析器。

ANYCHAR : . ; 
+0

好主意。 **但它也不會給我任何結果**。不正確的文本沒有任何錯誤。 – Andremoniy 2013-03-13 13:22:36

+0

你確定輸入得到了正確的標記(從輸入中得到的無效「@」字符,一直到解析器)?您尚未發佈語法,因此很難測試您的情況。 – 2013-03-13 13:30:14

+0

我可以證實,添加這樣的'ANYCHAR'詞法分析器規則不能解決問題。但是關於「OutofmemoryError」的第二個問題的回答很好地解決了這個問題。很明顯,這兩個問題都是交錯的。 – Andremoniy 2013-03-13 13:34:09