2014-02-26 75 views
0

我們使用antlr作爲數據點的層次結構,它們可以相互計算,其中計算由公式表示。
假設我們有來自外部測量系統的基礎數據點a1和a2。 然後,我們可以通過公式 「a1 + a2」定義一個數據點b作爲a1和a2之和。


一切工作到目前爲止,但問題是,antlr似乎回溯錯誤分支時解析通過拋出,捕獲和重新拋出NoViableAltException。


我們使用Sam Harwell的Antlr的C#端口並將其用於C#,並在VStudio 2012中進行調試。 Visual Studio捕獲並顯示第一次機會異常,這是一個相當緩慢的過程。 即使在調試器窗口中選擇不顯示第一次機會異常,它們仍然被捕獲並減慢調試器。

由於有數百個由公式定義的數據點,這些第一次機會異常會使調試非常慢。

我的問題是:有沒有辦法改進語法以減少第一次機會的次數NoViableAltException?
或者更改antlr代碼是否有意義,通過返回值實現回溯,而不是拋出/捕獲NoViableAltException?第一次機會NoViableAltException減慢調試速度

+0

我不是antlr用戶,但是這些異常是否出現在您的代碼或庫中? – rene

+0

它們出現在圖書館和我的語法中由antlr自動生成的代碼中。 – Stoffelche

回答

0

我不確定ANTLR 3如何與backtrack=true選項相互作用,因爲我個人從未在生產中使用該構造。

  • 如果你有能力,你應該考慮updating to ANTLR 4,不需要訴諸回溯長期先行序列(事實上,有在ANTLR 4沒有backtrack選項)。

  • 否則,您應該更新語法以在成功解析輸入時刪除backtrack=true選項。即使在調試器之外,這也會顯着提高解析器的性能。

backtrack=true選項應僅作爲實驗選項處理。它對生產代碼的影響很大,往往會導致不可預知和/或無法解釋的行爲。

+0

我沒有明確設置backtrack = true選項。可能是我沒有正確使用術語回溯。無論如何,在解析過程中拋出許多第一次機會NoViableAltException。這是antlr的常規行爲還是語法錯誤? – Stoffelche

+0

這意味着語法不是您輸入的正確表示,反之亦然。如果你糾正了語法或語法錯誤,它將停止拋出異常。 –

+0

感謝您的回覆。我一直認爲這個異常是解析過程中的常規機制,因此如果它與輸入表達式的某個部分相關,則不會檢查。 – Stoffelche