編譯原理——第五章

第五章  語法分析    自下而上分析

知識總結

一、自上而下分析基本問題

1、移進規約

基本思想:

用一個寄存符號的先進後出棧,把輸入符號一個一個地移進到棧裏,當棧頂形成某個產生式的候選式時,即把棧頂的這一部分替換成(歸約爲)該產生式的左部符號。

規約:

是指根據文法的產生式規則,把產生式的右部替換成左部符號。

2、規範規約

短語:

定義:令G是一個文法,S是文法的開始符號,假定αβγ是文法G的一個句型。

其中α,β,γ∈(VN∪VT)*,A∈VN ,如果有

則β稱是句型αβγ相對於非終結符A的短語。

直接短語:

特別是,如果有A=>β,則稱β是句型αβγ相對於規則A—>β的直接短語

句柄:

一個句型的最左直接短語稱爲該句型的句柄。

規範規約:


注意:

(1)規範歸約是關於一個最右推導的逆過程
    最左歸約是關於一個規範推導的逆過程
    由規範推導推出的句型稱爲規範句型

(2)由於規範句型由最右推導推出的句型,故該句型的句柄右邊只含有終結符號

語法樹與分析法

(1)子樹:是由該樹的某個結點(子樹的根)連同它的所有子孫組成。

(2)簡單子樹:只有單層分支的子樹(只有父子兩代沒有第三代)

(3) ①每個句型都有一棵語法樹與之對應
     ②每棵語法樹的葉結點自左至右排列就組成一個句型
     ③每棵子樹的葉結點自左至右排列就組成一個短語
     ④每棵簡單子樹的葉結點自左至右排列就組成一個直接短語

     ⑤每棵最左簡單子樹的葉結點自左至右排列就組成一個句柄

3、用符號棧進行自下而上的語法分析

'#’的使用
(1)在分析開始時,將’#’預先進棧,作爲棧底符號
(2)將’#’作爲輸入串的結束符

即分析開始時的格局爲


自左向右對輸入串ω不斷向棧中進行移進——歸約,直到形成如下格局

表示分析成功。

二、算符優先分析法

1、定義兩個終結符‘a’與‘b’的優先關係

a =.b   表示a的優先性等於b
a >.b   表示a的優先性大於b

a <.b   表示a的優先性小於b 

2、算符優先文法及優先表構造

算符優先文法

(1)算符文法

定義:一個文法,如果它的任一產生式的右部都不含兩個相繼(並列)的非終結符,即不含如下形式的產生式右部:

…QR… 

則我們稱該文法爲算符文法,也稱OG文法。

(2)定義終結符之間的優先關係

假定G是一個不含產生式的算符文法。對於任何一對終結符a、b,我們說:

1. a =. b 當且僅當文法G中含有形如P→…ab…或P→…aQb…的產生式;

2. a <. b 當且僅當G中含有形如P→…aR…的產生式, 而R  b…或R Qb…;

3. a>.b 當且僅當G中含有形如P→…Rb…的產生式,而 R …a或R…aQ。

(3)如果一個算符文法G中的任何終結符對(a,b)至多隻滿足下述三關係之一:
a=.b
a>.b
a<.b

 則稱G是一個算符優先文法(OPG文法)。

構造算符優先關係表

(1)通過檢查產生式的每一個候選式可以找出滿足a=.b
  (即P→…ab…或P→…aQb…的產生式)

(2)爲了滿足<.和>.,需對G中每個非終結符P構造兩個集合FIRSTVT(P)和LASTVT(P)



(3)構造集合FIRSTVT(P)的算法
按其定義,可用下面兩條規則來構造集合FIRSTVT(P):
① 若有產生式P→a…或P→Qa…,
則aFIRSTVT(P);
② 若aFIRSTVT(Q),且有產生式P→Q…,

則aFIRSTVT(P)。

(4)同理構造構造集合LASTVT(P)的算法
按其定義,可用下面兩條規則來構造集合LASTVT(P):
① 若有產生式P→… a或P→… aQ ,
則aLASTVT(P);
② 若a LASTVT(Q),且有產生式P→… Q ,

則aLASTVT(P)。

(5)有了這兩個集合之後,就可以通過檢查每個產生式的候選式確定滿足關係<.和>.的所有終結符對。
①假定有個產生式的一個候選形爲
   …aP…
  那麼,對任何bFIRSTVT(P),有a <. b。
②假定有個產生式的一個候選形爲
…Pb…

  那麼,對任何aLASTVT(P),有a >. b。

注意:
對於‘#’號,相當於在文法開始符號S前加一個額外的開始符號,比如爲Z

然後,把

Z →#S#

添加到原文法中,再進行分析。

3、算符優先分析算法的設計

(1).問題的提出
自下而上分析
移進-歸約法:句柄爲可歸納串
算符優先分析法:最左素短語爲可歸納串
(2).素短語
指一個句型的短語,它至少包括有一個終結符號且除去它本身之外不再含任何更小的素短語
(3).最左素短語

處在句型最左端那個素短語成爲最左素短語

(4).算符優先分析算法和設計

①句型的一般表示形式:
 #N1a1N2a2…NnanNn+1#
 其中,每個ai都是終結符,Ni是可有可無的非終結符
②定理:
一個算符優先文法G的任何句型的最左素短語是滿足如下條件的最左子串 Njaj…NiaiNi+1,
aj-1 <. aj
  aj =. aj+1,aj+1 =. aj+2,…,ai-1 =. ai
    ai >. ai+1

注意:

出現在左端或右端的非終結符一定屬於這個素短語

4、優先函數

優先函數的定義
把每個終結符與兩個自然數f(θ)與g(θ)相對應,使得
若θ1 <. θ2,則f(θ1) < g(θ2)
若θ1 =. θ2,則f(θ1) = g(θ2)
若θ1 >. θ2,則f(θ1) > g(θ2)

f稱爲入棧優先函數,g稱爲比較優先函數。

優先函數的構造方法
如果優先函數存在,則可以通過以下三個步驟從優先表構造優先函數:
(1)對於每個終結符a,令其對應兩個符號fa和ga,畫一張以所有符號fa和ga爲結點的方向圖。如果a>.b,則從fa畫一條弧至gb如果a<.b,則從gb畫一條弧至fa 。
(2)對每個結點都賦予一個數,此數等於從該結點出發所能到達的結點(包括出發點自身)。賦給fa的數作爲f(a)賦給ga的數作爲g(a)。

(3)檢查所構造出來的函數f和g是否與原來的關係矛盾。若沒有矛盾,則f和g就是要求的優先函數,若有矛盾,則不存在優先函數。

三、LR分析法

1、LR分析方法和LL分析方法的比較:


LR分析方法——分析器結構


動作表
ACTION[s,a]:當狀態s面臨輸入符號a時,應採取什麼動作
每一項ACTION[s,a]所規定的四種動作:
       <1>. 移進:把(s,a)的下一狀態s’=GOTO[s,a] 和輸入符號a推進棧,下一輸入符號變成現行輸入符號.
       <2>. 歸約:指用某產生式A進行歸約.  假若的長度爲r, 歸約動作是A, 去除棧頂r個項,使狀態sm-r變成棧頂狀                     態,然後把(sm-r, A)的下一狀態s’=GOTO[sm-r, A]和文法符號A推進棧.
       <3>. 接受:宣佈分析成功,停止分析器工作。

       <4>. 報錯:發現源程序含有錯誤,調用出錯處理程序

      si:移進,並將狀態i進棧。

      ri:用第i個產生式歸約,同時狀態棧與符號棧退出相應個符號,根據GOTO表將相應狀態入棧。

LR分析過程

第一步  分析開始時,首先將初始狀態SO及句子左界符#推入分析棧中。

第二步  設在分析的某一步,分析棧及餘留的輸入符號串處於如下的格局。 


則以棧頂的狀態及正掃視的輸入符號ai組成符號對(Sm,ai)去查分析動作表,並根據表元ACTION[Sm,ai]的指示完成相應的分析動作。每一分析表元所規定的動作,僅能是下列四種動作之一: 

(1)若ACTION[Sm,ai]=“移進”,這表明句柄尚未在棧頂部形成,此時正期待繼續移進輸入符號以形成句柄,故將當前的輸入符號推入棧中:


然後,以符號對(Sm,ai)查狀態轉移表,設相應的表元GOTO [Sm,ai]= Sm+1,再將此新的狀態(即要轉移到的下一狀態)推入棧中,則有如下的格局:



(2)若ACTION[Sm,ai]= rj ,其中rj意指按文法的第j個產生式A→Xm-r+1 Xm-r+2…Xm進行歸約。

   將分析棧從頂向下的r個符號(因爲該產生式右部符號串的長度爲r)退出,然後再將文法符號A推入棧中,此時分析棧的格局爲:


然後,以(Sm-r ,A)查狀態轉移表,設GOTO [Sm-r,A]=Sl,將此新狀態推入棧中,則有如下的格局:

需注意的是,當完成歸約動作之後,輸入串指示器不向前推進,它仍然指向動作前的位置。

(3)若ACTION[Sm,ai]=“接受”,則表明當前的輸入串已被成功地分析完畢,應中止分析器的工作。

(4)若ACTION[Sm,ai]=ERROR,則表明當前的輸入串中有語法錯誤,也應終止分析器的工作。

第三步  重複上述第二步的工作,直到在分析的某一步,棧頂出現“接受狀態”或“出錯狀態”爲止。對於前者,分析棧的最終格局應爲:


其中,Z爲文法的開始符號,Sα則爲使ACTION[Sα,#]=“接受”的唯一狀態(即接受狀態)。

對任何不同的LR(1)分析表都適用。

2、LR(0)項目集族和分析表的構造

活前綴:

文法G的活前綴是他的規範句型的前綴,該前綴不超過句柄的右端。

活前綴特點:

該前綴加上被分析串中未被分析的終結符,就可以構成一個規範句型

活前綴與句柄間的關係:

(1)活前綴中已含有句柄的全部符號(句柄的符號即爲其最右符號)。
(2)活前綴中含句柄的一部分符號(句柄開頭的 若干符號與活前綴最右的若干個符號一致)。

(3)活前綴中全然不包含句柄的任何符號 。

LR(0)項目:在每個產生式的右部適當位置添加一個圓點構成項目。

構成識別一個文法活前綴的DFA項目集(狀態)的全體稱爲這個文法的LR(0)項目集規範族。

I的閉包CLOSURE(I):

(1)  I的任何項目都屬於CLOSURE(I);
(2)  若A→·B屬於CLOSURE(I),那麼,對任何關於B的產生式B→的項目B→·也屬於CLOSURE(I);
(3)  重複執行上述兩步驟直至CLOSURE(I) 不再增大爲止
例如:設I={S→·E}

則CLOSURE(I)={S→·E ,E→·aA, E→·bB}

定義轉換函數如下:
GOTO(I,X)=CLOSURE(J)其中:
I爲包含某一項目集的狀態,
X爲一文法符號,

J={任何形如A→X•的項目|A→•X屬於I}。

LR(0)分析表的ACTION和GOTO表的構造步驟


LR(0)項目集規範族存在移進-歸約,或歸約-歸約衝突,稱爲LR(0)文法。

知識應用

總結

通過整理可以看出這一章的內容多而雜,並且理解起來很吃力,更不用說做題了。課後提目前只能獨立完成基礎題,稍微複雜一點的題做起來就沒有了思路,不停地翻課件,看例題。但是還是無果,只能藉助一些資料來完成。這一章的內容短時間內還無法消化,只能有時間了再通過自己的博客和課件鞏固學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章