編譯原理系列之六 自底向上的LR分析法(1)-LR(0)分析法


LR(0)分析法

一、基本概念

  1. 拓廣文法:

    對於文法 G = (VN, VT, P , S ) , 增加如下產生式:S’->S ,其中, S’ ∈ VN∪ VT , 得到 G 的拓廣文法,G’ = (VN ’, VT, P ’ , S’ )

    其實就是增加了一條右部為開始符號的產生式,就變成了拓廣文法

  2. 可歸前綴:

    采取歸約過程前符號棧中的內容,稱做可歸前綴。
    這種前綴包含句柄且不包含句柄之后的任何符號;

  3. 活前綴

    對於文法 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。

    當前分析了的部分(符號棧中的符號)為規范句型的活前綴,表示當前分析了的部分是某規范句型的正確部分。

  4. 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

 

2869373-16bab55cf10501de.png

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”;

  • 分析表中凡不能用上述規則填入信息的空白格均置上“出錯標志”

    翻譯一下:

    1. 如果圓點不在項目k最后且圓點后的期待字符a為終結符,則ACTION[k, a] =sj (j表示新狀態Ij);
    2. 如果圓點不在項目k最后且圓點后的期待字符A為非終結符,則GOTO(k, A)=j (j表示文法中第j個產生式);
    3. 如果圓點在項目k最后且k不是S’ ->S,那么對所有終結符a,ACTION[k, a]=rj (j表示文法中第j個產生式);
    4. 如果圓點在項目k最后且k是S’ ->S,則ACTION[k, #]為“acc”;

例子:

考慮文法G[S] :
S → (S) | a
相應的LR(0) FSM如下,構造其LR(0)分析表。

2869373-24792d5abfee9bbe.png

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”;

2869373-ae315fcdb75b399c.png

LR(0)分析表

3.LR(0) 分析流程

設輸入串為w,ip指向輸入串w的首符號a,i指向符號棧頂;狀態棧的初始棧頂為0,符號棧初始棧頂為#。

算法流程圖為:

2869373-f4701ccabe0b0297.png

LR(0) 算法流程圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM