2017-07-04 42 views
-1

我按照antlr網站上的錯誤處理說明http://www.antlr2.org/doc/err.html(它說antlr2,但我找不到antlr4的替代方法)併爲我的規則編寫了異常處理,如下所示。antlr4錯誤處理甚至沒有編譯

subStmt : 
(visibility WS)? (STATIC WS)? SUB WS? ambiguousIdentifier (WS? argList)? endOfStatement 
block? 
END_SUB 
; 
exception 
catch [RecognitionException ex] { 

} 

但是,當我試圖生成語法解析器是如下失敗: Java的罐子../Downloads/antlr-4.7-complete.jar vba.g4 -package VBA -o出來 錯誤(50):vba.g4:500:4:語法錯誤:'catch'對我來說是一個完整的驚喜,同時匹配規則前導碼

任何幫助,非常感謝。

回答

0

Antlr4與Antlr2完全不同。

How to implement error handling in ANTLR4

更新有一個簡單的方法:通過在看看這個問題(和答案)啓動

錯誤報告,基本的方法是使實現ANTLRErrorListener接口的類。 BaseErrorListener對所有方法都有空的實現,所以你只需要實現你關心的那些。你可能最關心的是syntaxError()

在您的解析器對象上,調用removeErrorListeners()來清除內部錯誤偵聽器,然後用要處理錯誤的類的實例調用addErrorListener()

在解析期間遇到錯誤時,您將獲得該類的syntaxError()調用。

其他方法可能(或可能不)讓你做你想做的事情;我沒有使用這個接口從解析錯誤中恢復。

爲了從特定錯誤中恢復,您可以使用ANTLRErrorStrategy接口實現一個類。這變得複雜;默認實現請參見DefaultErrorStrategy

一個非常簡單的方法是處理語法中可能出現的錯誤。不知道你能走多遠,但這可能是最簡單的方法。

+0

這個例子看起來很複雜。我的情況可能是簡單地忽略某些規則中的錯誤(我需要接受有錯誤的輸入)。是否沒有antlr4錯誤處理文檔? –

+0

@HughDarling不夠公平 - 我的答案稍微延長了一點。 – janm