2017-03-07 31 views
0

在ANTLR 4中,通過實現ANTLRErrorListener可以擴展錯誤/異常處理。只有當我遍歷使用詞法分析器和解析器創建的樹時,纔會觸發事件。 例如ANTLR 4在觸發監聽事件之前預先進行錯誤和異常處理

parser.removeErrorListeners(); 
parser.addErrorListener(new MyTryDSLErrorListener()); 
ParseTreeWalker walker = new ParseTreeWalker(); 
MyTryDSLListener listener = new MyTryDSLListener(); // Can be replaced by default Base listener(empty implementation) 
walker.walk(listener, parser.test()); // At this line tree will be traversed and if any error then MyTryDSLErrorListener's callback will be called. 

我想知道有沒有乾淨的方式來獲得輸入 字符串錯誤,而無需調用監聽器/訪問者。

注:雖然沒有用的默認實現替換監聽器來處理此問題的方法。然後再次遍歷樹自己實現的聽衆,就像如下:

walker.walk(new TryDSLBaseListener(), parser.test()); // Find if has any errors. 
walker.walk(new MyTryDSLListener(), parser.test()); // Actual use case. 

回答

0

ANTLRErrorListener只有在分析過程中報告通過在線解析器遇到錯誤。也就是說,偵聽器報告語法錯誤是由於語法分析器執行語法的啓動規則而導致的。

監聽器沒有參與分析樹步行操作。

更新

parser.removeErrorListeners(); 
parser.addErrorListener(new MyTryDSLErrorListener()); 
ParseTree tree = parser.test(); 

調用parser.test()啓動分析器執行以創建解析樹。在執行期間,如果並且在解析器遇到錯誤時,解析器通過在解析器中註冊的ANTLRErrorListener報告錯誤。所有此類錯誤將在parser.test()返回時報告。

此時已經構建了一個分析樹。步行與樹木建設完全分離。解析器註冊ANTLRErrorListener s將不會被調用。

ParseTreeWalker walker = new ParseTreeWalker(); 
MyTryDSLListener listener = new MyTryDSLListener(); 
walker.walk(listener, tree); 
+0

您可以請詳細解釋_解析器中的解析器_或如果可能請您提供給我的教程。如果我理解它,那麼我應該將它改爲:'parser.test();'?然後添加聽衆並穿過樹? –