考慮我們嘗試將某些不正確的輸入文本提供給某些語法(例如,包含某些未知令牌的文本)。在解釋過程中,我們將在圖中看到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
以及如何?
好主意。 **但它也不會給我任何結果**。不正確的文本沒有任何錯誤。 – Andremoniy 2013-03-13 13:22:36
你確定輸入得到了正確的標記(從輸入中得到的無效「@」字符,一直到解析器)?您尚未發佈語法,因此很難測試您的情況。 – 2013-03-13 13:30:14
我可以證實,添加這樣的'ANYCHAR'詞法分析器規則不能解決問題。但是關於「OutofmemoryError」的第二個問題的回答很好地解決了這個問題。很明顯,這兩個問題都是交錯的。 – Andremoniy 2013-03-13 13:34:09