假設我有一組 LR(1) 狀態,我想嘗試將其轉換為 LALR(1)。我第一步是找到具有相同 LR(0) 核心的狀態,現在我正在執行合并程序。然而,這樣一組狀態中的一個不能被合并,因為它會引入 RR 沖突。我應該:
- 立即停止轉換并說構造此狀態機的語法不是 LALR(1) 語法,
- 或者我應該繼續合并其他可能的狀態,并且只有在沒有這樣的候選人可以合并的情況下才停止?
uj5u.com熱心網友回復:
沖突不會隨著更多的合并而消失,因此您可以立即停止并報告失敗。
不過,大多數決議器生成器會一直持續到最后:
- 用戶可能會喜歡了解所有沖突,而不僅僅是發現的第一個沖突,以便除錯他們的語法;
- 有時,解決沖突的簡單啟發式方法可以成功生成可用的決議器。(例如,Yacc 首先使用宣告的運算子優先級進行決議,然后優先使用移位而不是歸約,最后優先使用語法中較早出現的歸約。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/452162.html
