2014-08-27 119 views
0

我的腳本語言包含了一系列的宏,規則定義如下ANTLR的4錯誤恢復

program 
: macrodeclaration* EOF 
; 

macrodeclaration 
: (STATIC)? 'MACRO' STRING declareparameter 
    statement* 
    'ENDMACRO' 
; 

有時我輸錯endmacro爲endmacros,解析器吃掉令牌「endmacros」而忽略了一個宏定義,繼續搜索下一個endmacro。它吐出了很多沒有可行的替代錯誤。

我想知道如何調整錯誤恢復,將錯誤輸入的endmacros視爲endmacro,因此只報告一個錯誤,並且可以正確解析下一個宏。

請幫忙。

回答

0

錯誤恢復是一個棘手的問題。您可以隨時添加新的令牌ENDMACROS並允許它結束,但如果用戶寫入ENDMCROendmacro或僅END會發生什麼情況?或者如果他們在其他地方使用ENDMACROS作爲標識符會發生什麼情況。

因爲它代表今天的結果如下:

  1. ANTLR 4返回正確答案爲正確的輸入(在現實中有一些已知漏洞的剩餘,但目標始終是達到這個)。
  2. 沒有人實施並提交了更好的廣義錯誤恢復策略,作爲對項目的拉動請求,對正確輸入的性能沒有負面影響。

除非您計劃設計和實施廣義的錯誤恢復策略,否則最好的辦法就是在解析階段完成之前爲錯誤添加某種過濾器。對於語義分析期間發生的錯誤(使用訪問者/步行者/等),您可以在停止之前報告更多錯誤。