LR分析器是一種由下而上(bottom-up)的上下文無關語法分析器。
基本介紹
- 中文名:LR剖析器
- 學科:計算機
簡介
- 眾多的程式語言都可以用某種LR分析器(或其變形)分析文法。(C++是個著名的例外)
- LR分析器可以很有效率的建置。
- 對所有“由左而右”掃描原始碼的分析器而言,LR分析器可以在最短的時間內偵測到文法錯誤(這是指文法無法描述的字元串)。
LR分析器的結構
- 一個輸入緩衝器,輸入的原始碼存儲於此,分析將由第一個符號開始依序向後掃描。
- 一座堆疊,存儲過去的狀態與化簡中的符號。
- 一張狀態轉移表(goto table),決定狀態的移轉規則。
- 一張動作表(action table),決定目前的狀態碰到輸入符號時應採取的文法規則,輸入符號指的是終端符號(Terminals)與非終端符號(Non-terminals)。
分析算法
- 將結尾字元$與起始狀態0依序壓入空堆疊,之後的狀態與符號會被壓入堆疊的頂端。
- 根據目前的狀態以及輸入的終端符號,到動作表中找到對應動作:
- 考慮第m條文法規則,假設該文法的右邊(right-hand side)有X個符號,則將2X個元素從堆疊中彈出
- 此時過去的某個狀態會回到堆疊頂端
- 在狀態轉移表中查找此狀態遇到文法左邊(left-hand side)的符號時的狀態轉移
- 將文法左手邊的符號壓入堆疊
- 將查找到的新狀態壓入堆疊
- 將目前的終端符號由輸入緩衝器中移出並壓入堆疊
- 再將狀態n壓入堆疊並成為最新的狀態
- 移位(shift)sn:
- 化簡(reduce)rm:
- 接受,輸入字元串解析完成。
- 無對應動作,此情形即為文法錯誤。
- 重複步驟二直到輸入的字元串被接受或偵測到文法錯誤。