2012-02-22 73 views
2

我在使用ANTLR v3恢復和重新發布錯誤時遇到問題。我遵循這個鏈接http://www.antlr.org/blog/antlr3/error.handling.tml,但我沒有解決方案。 我想讓例如一些報告和恢復 在這樣的源程序: 學生輸入代碼:ANTLR:錯誤恢復和報告

FOR(int a=0;a<10;a++){ 
b=b*a; 
} 

,並計劃將報告是這樣的: 計劃:「是你的意思是關鍵字,用於爲對於?」 學生回答:「是」 之後,系統自動恢復並修改源代碼。 ANTLR v3如何做到這一點?不可能與ANTLR做什麼? 需要幫助。多謝你們!

+0

重新開始解析從頭開始是否可以接受?它可能會簡化實施。 – sarnold 2012-02-22 04:07:47

+0

是的..你有解決方案嗎? – 2012-02-22 06:43:58

回答

1

我認爲你需要在生成的解析器類中覆蓋org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken

ANTLR檢測到無效標記時調用此函數。因此,在您自己的功能中,您可以詢問用戶是否需要恢復。

如果需要,則可以撥打BaseRecognizer.recoverFromMismatchedToken執行恢復。如果沒有,你可以拋出異常MismatchedTokenException

+0

你能給我這個例子的鏈接嗎?我只是混淆。但是謝謝lex li – 2012-02-22 06:43:22

+0

我不能給你一個Java的例子,因爲我在C#中使用ANTLR。 https://github.com/lextm/sharpsnmplib/blob/2f9e8d2d48547b37e7cb6d75cdcb0ffae29f82e3/SharpSnmpLib/Mib/SmiParser.cs這是C#中定義的部分類,它將最終與Smi.g語法中的ANTLR生成的SmiParser.cs文件合併文件。 SmiParser類是從ANTLR的BaseRecognizer派生而來的。在這裏,我覆蓋了RecoverFromMismatchedToken函數,只是簡單地拋出一個異常。在Java中,您應該使用類似的方法來覆蓋函數,然後實現自己的邏輯。 – 2012-02-22 09:12:30

+0

感謝lex li爲此解決方案。對於你的情況,這是不可能的使用ANTLR的概念像這樣http://stackoverflow.com/questions/9262195/parsing-java-code-with-antlr-need-concept – 2012-02-22 14:31:28