2
通常如何添加錯誤生成?我遇到了我的錯誤產生太淺的問題:當語法分析器在語句中的錯誤上啓動彈出狀態時,它會彈出,直到它遇到它所在的部分的錯誤生成,並打印出無效的錯誤信息。將錯誤生成添加到語法中的策略是什麼?
爲每個非終端添加一些描述性錯誤生成是一個好主意嗎?
通常如何添加錯誤生成?我遇到了我的錯誤產生太淺的問題:當語法分析器在語句中的錯誤上啓動彈出狀態時,它會彈出,直到它遇到它所在的部分的錯誤生成,並打印出無效的錯誤信息。將錯誤生成添加到語法中的策略是什麼?
爲每個非終端添加一些描述性錯誤生成是一個好主意嗎?
錯誤產生是關於從錯誤中恢復以嘗試繼續處理輸入,而不是打印合理或有用的錯誤消息。因此,它們應該用在語法中的某些點上,以便可以正確識別和重新同步輸入流。例如,如果您的語言包含以;
字符結尾的結構序列,則良好的錯誤生成類似construct: error ';'
,它將從construct
中的錯誤中恢復(不管是什麼),方法是將輸入前跳到;
並嘗試從那裏繼續。
設置許多錯誤恢復規則通常是一個糟糕的主意,因爲解析器只會恢復到最接近的一個,而且它通常是最高級別的最全球的解決方案,最有可能是有用的,並試圖使用更精細粒度只會導致錯誤級聯,因爲錯誤恢復規則無法正確地與輸入重新同步。
另外,'construct:error';''規則應該有一個調用'yyerrok;'的動作來將解析器踢出錯誤恢復模式。 – Kaz 2014-07-10 05:54:52
@Kaz:'yyerrok'可能有用,但不是必需的 - 使用它意味着如果在此之後發生另一個錯誤,它不會被忽略(所以會產生另一個語法錯誤消息),這可能是也可能不是你想要什麼。沒有它,你需要移動2個令牌(包括';')來擺脫錯誤恢復模式。 – 2014-07-10 23:35:37