自底向上分析之LR分析法
說明:以老師PPT為標准,借鑒部分教材內容,AlvinZH學習筆記。
基本概念
1. LR分析:從左到右掃描(L)自底向上進行規約(R),是規范規約,也即最右推導(規范推導),是自底向上分析方法的高度概括和集中。
2. LR(k)文法確定的分析器適用於一大類上下文無關文法的語法分析,基本上包括了所有無二義性的上下文無關文法的集合,包括了前面討論的LL(k)和算符優先文法。
3. 優缺點
- 適合文法類足夠大,適用於所有上下文無關文法
- 分析效率高
- 報錯及時
- 可以自動生成
- 但手工實現工作量大
4. LR分析器的組成:狀態棧、分析表、控制程序。
- 狀態棧:放置分析器狀態和文法符號;
- 分析表:由兩個矩陣組成,其功能是指示分析器的動作,是移進還是規約,根據不同的文法類要采用不同的構造方法。
- 控制程序:執行分析表所規定的動作,對棧進行操作。
不同的LR分析器區別在於分析表的構造方法,狀態棧和控制程序都是一樣的。
5. 不同文法類層次結構
下面我們講討論LR(0)、SLR(1)、LR(1)、LALR(1)。
- LR(0):
- SLR(1):簡單LR方法,最容易實現,功能最弱,適應文法范圍較小,大師具有較高的實用價值;
- LR(1):規范的LR方法,功能最強,適應的文法范圍最大,但實現的代價最高,故使用價值不大。
- LALR(1):向前看的LR方法,適用文法范圍介於上述兩者之間,可用於大多數程序設計語言,用途最廣。
注:三種方法對應三種分析表構造方法,三種分析表分別對應三類文法。一個SLR文法必定是LALR文法和LR文法。
LR分析器
1. LR分析器為一個輸入串逆向構造了一個最右推導。通過考慮現有符號串(句型)以及向前看未處理的前k個字符就能識別出句柄(最左簡單短語),成該文法為LR(k)文法。
2. 活前綴
規范句型:通過規范規約得到的句型。
規范句型前綴:將輸入串的剩余部分與其連結起來就構成了規范句型。對於復返句型 \(αβt\),\(αβ\)即是一個前綴。
活前綴:對於句型 \(αβt\), \(β\) 表示句柄,如果 \(αβ = u1 u2 … ur\),那么符號串u1 u2 …ui (1≤i≤r)即是句型 \(αβt\) 的活前綴。
舉個例子:
3. 分析表:兩個矩陣,狀態轉移表(GOTO表)和分析動作表(ACTION表)。
GOTO表:行為分析器的狀態,列為文法符號(Vn+Vt)。GOTO[Si-1, xi] = Si,表示當前棧頂狀態 Si-1 遇到新的棧頂符號 xi 要轉移到新的棧頂狀態 Si。可以看出,GOTO表定義了一個以文法符號集為字母表的有窮自動機,該自動機識別文法所有規范句型的活前綴。
ACTION表:ACTION[ Si , a ] =分析動作。分析動作有四種:移進、規約、接受。出錯。
兩個表可以融合,方便查表。
4. 控制程序:根據棧頂狀態和現行輸入符號,查分析動作表(ACTION表),執行由分析表所規定的操作;並根據GOTO表設置新的棧頂狀態(即實現狀態轉移)。
5. 分析過程:每次規約總是規約當前句型的句柄,是規范規約!分析的每一步棧內符號串均是規范句型的活前綴,且與輸入串的剩余部分構成規范句型。
構造LR分析表
1. 方法:根據文法構造識別規范句型活前綴的有窮自動機 DFA。再由由DFA構造LR分析表。
DFA定義五元式:M = ( S, V, GOTO, S0, Z )
S:有窮狀態集
V:文法字匯表(Vn+Vt)
GOTO:狀態轉移表對應的轉移函數
S0:初始狀態
Z:終態集,在這里除了S0以外其余狀態都是終態。
2. DFA中的有窮狀態集S在此,S = LR(0)項目集規范族。
項目集規范族:每個元素為項目組成的集合。
項目:在文法G的產生式右部某處加點的產生式,如對於產生式 \(A→XY\),有項目
\(A→.XY\) 、\(A→X.Y\) 、\(A→XY.\) 三個項目。特別的,對於 \(A→ε\),存在唯一項目 \(A→.\)。
LR(0)分析法
1. 求解單個的項目集,對應DFA中的單個元素。
閉包運算,如果I是文法G的項目集,那么closure(I)由一下兩條規則求得:
- 初始時,將I的每個項目放入closure(I)中;
- 如果 \(A→α.Bβ\)在closure(I)中,且存在產生式 \(B→γ\),則將 \(B→.γ\) 加入closure(I)中。
2. goto函數:goto(I,X)中I是項目集,X是文法符號,goto(I,X)定義為所有形如 \([A→αX.β]\)項目集的閉包,前提是 \([A→α.Xβ]\) 在I中。
即有goto(I,X)= closure(J),右部分仍是項目集。直觀地說,這一步之后,找到了DFA中從狀態 \(I\) 經過 \(X\) 弧轉移到狀態 closure(J)。
SLR(1)
LR(1)
LALR(1)
本節內容太多了,考完再寫了,對不起~
引用說明
- 邵老師課堂PDF
- 《編譯原理級編譯程序構造》