LR(0)分析法
一、基本概念
-
拓廣文法:
對於文法 G = (VN, VT, P , S ) , 增加如下產生式:S’->S ,其中, S’ ∈ VN∪ VT , 得到 G 的拓廣文法,G’ = (VN ’, VT, P ’ , S’ )
其實就是增加了一條右部為開始符號的產生式,就變成了拓廣文法
-
可歸前綴:
采取歸約過程前符號棧中的內容,稱做可歸前綴。
這種前綴包含句柄且不包含句柄之后的任何符號; -
活前綴
對於文法 G = (VN, VT, P , S ) , 設 S’ 是其拓廣文法的開始符號(即有產生式 S’-> S), 且α,β∈(VN∪VT)* , ω∈VT*。
若 S’ =*=>α A ω 且 A ->β, 即 β 為句柄,則 αβ 的任何前綴 γ 都是文法 G 的活前綴。
注:由於 S’ =*=>S’ 且 S’ -> S, 故 S 是 G 的活前綴 。也就是說可歸前綴的所有前綴(包括可歸前綴)都是活前綴。
例:文法 G[S] :
(1) S -> AB
(2) A -> aA
(3) A -> ε
(4) B -> b
(5) B -> bB
句子 aaab 是一個句型,其唯一的句柄為:ε (aaaεb); 活前綴有:ε,a,aa,aaa。當前分析了的部分(符號棧中的符號)為規范句型的活前綴,表示當前分析了的部分是某規范句型的正確部分。
-
LR(0)項目 :
在文法G中每個產生式的右部適當位置添加一個圓點構成項目。
每個項目的含義是:欲用改產生式歸約時,圓點前面的部分為已經識別了的句柄部分,圓點后面的部分為期望的后綴部分。
分類:
移進項目: 形如 A -> α• aβ,對應移進狀態,把a移進符號棧。
待約項目: 形如 A -> α • Bβ,對應待約狀態,需要等待分析完非終結符B的串再繼續分析A的右部。
歸約項目: 形如 A -> α •,句柄已形成,可以歸約。
接受項目: 形如 S’ -> S •。
初始項目: 形如 S’ -> • S。
其中a∈VT , α,β∈(VN∪VT)*, A,B∈VT
后繼項目: 表示同屬於一個產生式的項目,但是圓點的位置僅相差一個文法符號,則稱后者為前者的后繼項目。例:對於產生式S -> aAcBe,它有6個項目:
S -> ·aAcBe
S -> a·AcBe
S -> aA·cBe
S -> aAc·Be
S -> aAcB·e
S -> aAcBe·
二、LR(0) 有限狀態機的構造方法
1.用閉包函數(CLOSURE)來求DFA一個狀態的項目集:
CLOSURE(I)是這樣定義的:
首先I的項目都屬於CLOSURE(I);
如果A->α• Bβ,則左部為B的每個產生式中的形如B->·γ項目,也屬於CLOSURE(I);
例子:已知文法G[E]如下:
(1) E -> E+T
(2) E -> T
(3) T ->( E )
(4) T -> d可以直到它的拓廣文法G’ [E’]為 :
(0) E’ -> E
(1) E -> E+T
(2) E -> T
(3) T -> ( E )
(4) T -> d令I0 = CLOSURE({E’->.E})
則I0 = {
E’ -> • E,
E -> • E+T,
E -> • T,
T -> •( E ),
T -> • d
}
2.LR(0) FSM 的狀態轉移函數
GO (I,X) = CLOSURE(J)
其中,I為LR(0) FSM 的狀態(閉包的項目集),X為文法符號, J={ A -> αX•β | A -> α• Xβ∈I} ;
表示對於一個狀態項目集中的一個項目A -> α• Xβ,在下一個輸入字符是X的情況下,一定到另一個新狀態 A -> αX•β。
3.LR(0) 有限狀態機的構造
從 LR(0) FSM 的初態出發 ,先求出初態項目集的閉包(CLOSURE({S’->.S})),然后應用上述轉移函數,通過項目分析每種輸入字符下的狀態轉移,若為新狀態,則就求出新狀態下的項目集的閉包,級可逐步構造出完整的 LR(0) FSM。
LR(0) FSM 的構造舉例
給定文法G[E]:
(1) E -> E+T
(2) E -> T
(3) T -> ( E )
(4) T -> d構造LR(0) FSM
① G[E]的拓廣文法,得到G’ [E’]:
(0) E’ -> E
(1) E -> E+T
(2) E -> T
(3) T -> ( E )
(4) T -> d②構造G’[E’] 的 LR(0) FSM
LR(0) FSM
三、LR(0) 分析法
1.LR(0) 文法定義
文法 G 是 LR(0) 文法,當且僅當它的LR(0)FSM中的每個狀態都滿足:
①不同時含有移進項目和歸約項目,即不存在移進-歸約沖突。
②不含有兩個以上歸約項目,即不存在歸約-歸約沖突。
2.LR(0)分析表的構造
ACTION 表項和 GOTO表項可按如下方法構造:
-
若項目A ->α • aβ屬於 Ik 且 GO (Ik, a)= Ij, 期望字符a 為終結符,則置ACTION[k, a] =sj (j表示新狀態Ij);
-
若項目A ->α • Aβ屬於 Ik,且GO (Ik, A)= Ij,期望字符 A為非終結符,則置GOTO(k, A)=j (j表示文法中第j個產生式);
-
若項目A ->α •屬於Ik, 那么對任何終結符a, 置ACTION[k, a]=rj;其中,假定A->α為文法G 的第j個產生式;
-
若項目S’ ->S • 屬於Ik, 則置ACTION[k, #]為“acc”;
-
分析表中凡不能用上述規則填入信息的空白格均置上“出錯標志”
翻譯一下:
- 如果圓點不在項目k最后且圓點后的期待字符a為終結符,則ACTION[k, a] =sj (j表示新狀態Ij);
- 如果圓點不在項目k最后且圓點后的期待字符A為非終結符,則GOTO(k, A)=j (j表示文法中第j個產生式);
- 如果圓點在項目k最后且k不是S’ ->S,那么對所有終結符a,ACTION[k, a]=rj (j表示文法中第j個產生式);
- 如果圓點在項目k最后且k是S’ ->S,則ACTION[k, #]為“acc”;
例子:
考慮文法G[S] :
S → (S) | a
相應的LR(0) FSM如下,構造其LR(0)分析表。
LR(0) FSM
從I0看,S‘->·S,期望字符是非終結符S,根據上面的規則2,得到GOTO(0,S)=1;
S‘->·(S),期望字符是終結符(,根據上面的規則1,得到ACTION(0,()=S2;
從I3看,S->a·,根據規則3,置ACTION[3, a]為r2;
從I1看,S‘->S·,根據規則4,置ACTION[1, #]為“acc”;
LR(0)分析表
3.LR(0) 分析流程
設輸入串為w,ip指向輸入串w的首符號a,i指向符號棧頂;狀態棧的初始棧頂為0,符號棧初始棧頂為#。
算法流程圖為:
LR(0) 算法流程圖