6 自下而上的語法分析——LR分析
一、LR分析器
分析表的組成
LR分析過程
自底向上分析法的關鍵問題是在分析過程中如何確定句柄。
LR方法中的句柄是通過求可歸前綴而求得。
二、可歸前綴與活前綴
規範句型的這種前部分符號串稱爲可歸前綴
我們把形成可歸前綴之前包括可歸前綴在內的所有規範句型的前綴都稱爲活前綴
活前綴
LR分析需要構造識別活前綴的有窮自動機
- 可以文法的終結符和非終結符都看成有窮自動機的輸入符號,每次把一個符號進棧看成已識別過了該符號,同時狀態進行轉換,當識別到可歸前綴時,相當於在棧中形成句柄,認爲達到了識別句柄的終態。
三、構造識別活前綴的有窮自動機
1、 已有活前綴構造有限自動機
2、 活前綴及其可歸前綴的一般計算方法
3、 項目形式
由文法的產生式直接構造識別活前綴和可歸前綴的有限自動機
項目
:在每個產生式的右部適當位置添加一個圓點構成項目
項目分類:
構成識別一個文法活前綴的 項目集(狀態)的全體稱爲這個文法的LR(0)項目集規範族
NFA確定化爲DFA的工作量較大,我們考慮直接構造出項目集作爲DFA的狀態,就可直接構造DFA
通過閉包函數(CLOSURE)來求DFA一個狀態的項目集
一個項目集可能包含多種項目
a) 移進和歸約項目同時存在。 移進-歸約衝突
b) 歸約和歸約項目同時存在。 歸約-歸約衝突
LR(0)文法
:若其LR(0)項目集規範族不存在移進-歸約,或歸約-歸約衝突,稱爲LR(0)文法。
圓點不在產生式右部最左邊的項目稱爲核
,唯一的例外是。因此用轉換函數得到的J爲轉向後狀態所含項目集的核
使用閉包函數()和轉向函數()構造文法的的項目集規範族,步驟如下:
a)置項目爲初態集的核,然後對核求閉包得到初態的項目集
b)對初態集或其它所構造的項目集應用轉換函數求出新狀態J的項目集
c)重複b)直到不出現新的項目集爲止
LR分析器的構造
①構造識別文法活前綴的確定有限自動機
②根據該自動機構造相應的分析表(ACTION表、GOTO表)
總結:構造識別文法活前綴DFA的三種方法
- 根據形式定義求出活前綴的正規表達式,然後由此正規表達式構造再確定化爲
- 求出文法的所有項目,按一定規則構造識別活前綴的再確定化爲
- 使用閉包函數()和轉向函數()構造文法的的項目集規範族,再由轉換函數建立狀態之間的連接關係得到識別活前綴的
bingo~ ✨ 耐心和持久勝過激烈和狂熱。不管環境變換到何種地步,只有初衷與希望永不改變的人,才能最終克服困難,達到目的。
——《海底兩萬裏》