LL(1),LR(0),SLR(1),LALR(1),LR(1)對比與分析


前言:考慮到這幾種文法如果把具體內容講下來肯定篇幅太長,而且繁多的符號對初學者肯定是極不友好的,而且我相信看這篇博客的人已經對這幾個文法已經有所了解了,本篇博客的內容只是對

這幾個文法做一下對比,加深大家對這幾個文法的理解。更詳細的細節,初學者可以看看這個課件https://files-cdn.cnblogs.com/files/henuliulei/%E7%AC%AC5%E7%AB%A0.ppt,或者其他相關的博客。

一:五種文法的演變

1.1 LL(1)文法

LL(1)文法是自上而下的分析方法。

1.2 LR(0)分析方法

與LL(1)相對,LR(0)文法是下而上的分析方法,從左分析,從棧頂歸約。

1.3LR(0) -> SLR的必要性

對於LR(0),由於分析中一遇到終態就歸約,一遇到First集就移進,如果有一下狀態I1,I1包含兩個語法:
F->Y·+
F->Y·
那LR(0)就無法確定到底是移進還是歸約了,而且LR(0)本身要求無移進規約沖突。
這就是為什么我們要引入SLR解決reduce-shift conflict(盡管不能完全解決該問題).

1.4 SLR的介紹

如果不僅考慮First,而且把Follow集也考慮在內,就可以一定程度上解決reduce-shift conflict.
還是以上語法:
F->Y·+B
F->Y·
如果FOLLOW(F) = {a, b},那么當我們遇到a與b時,就可以選擇歸約F;當我們遇到+時,就可以選擇移進操作。

1.5 SLR -> LR(1)的必要性

SLR不能完全解決reduce-shift confict.
同樣還是上面的語法:
F->Y·+B
F->Y·
如果 FOLLOW(F) = {a, b, +},那當我們遇到 + 符號時,就無法確定到底是選擇移進操作得到F->Y+·B,還是歸約F。
SLR不能完全解決reduce-shift conflict. 這就是為什么我們要選擇LR(1) / LALR(1)了
SLR在方法中,如果項目集Ii含項目Aa.而且下一輸入符號aÎFOLLOW(A),則狀態i面臨a時,可選用“用Aa歸約”動作。
但在有些情況下,當狀態i顯現於棧頂時,棧里的活前綴未必允許把a歸約為A,因為可能根本就不存在一個形如“bAa”的規范句型。因此,在這種情況下,用“ Aa ”歸約不一定合適。 FOLLOW集合提供的信息太泛!

1.6LR(1)/LALR(1)介紹

具體可參考前言里面的PPT

二:LR(0),SLR(1),規范LR(1),LALR(1)的關系

   首先LL(1)分析法是自上而下的分析法。LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法。
              自上而下:從開始符號出發,根據產生式規則推導給定的句子。用的是推導
              自下而上:從給定的句子規約到文法的開始符號。用的是歸約

2. 1: SLR(1)與LR(0)的關系:

           SLR(1)與LR(0):簡單的LR語法分析技術(即SLR(1)分析技術)的中心思想是根據文法構造出LR(0)自動機。

            LR(0):見到First集就移進,見到終態就歸約

         SLR(1)見到First集就移進,見到終態先看Follow集,與Follow集對應的項目歸約,其它報錯。

2.2: LR(1)與LR(0)的關系:

      規范LR(1)語法分析技術的中心思想是根據文法構造出LR(1)自動機 ,而規范LR(1)自動機構造方法和LR(0)自動機的構造方法相同,只是多增加了向前搜索符號。

2.3 LR(1)與SLR(1)的關系

在構造SLR分析表的方法中 ,若項目集Ik中含有 Aàα• ,那么在狀態k時,只要面臨輸入符號a∈FOLLOW(A) ,就確定用產生式 Aàα進行歸約。

但是,在某些情況下,當狀態k呈現於棧頂時,棧里符號串所構成的活前綴未必允許把α規約成A,因為可能沒有一個規范句型含有前綴βAa,

因此,此時用產生式 Aàα進行歸約未必有效。計算FOLLOW集合所得到的超前符號集合可能大於實際能出現的超前符號集。LR(1)很好的解決了該問題。

2.4:規范LR(1)與LALR(1)的關系:

      LALR(1)是對LR(1)項集族I中具有同心項的項集進行合並得到I',然后根據I’進行分析的方法。

三:判斷LL(1)SLR(1)LR(1)LALR(1)

3.1:LL(1)就是向前只搜索1個符號,即與FIRST()匹配,如果FIRST為空則還要考慮FELLOW。

3.2:LR需要構造一張LR分析表,此表用於當面臨輸入字符時,將它移進,規約(即自下而上分析思想),接受還是出錯。
3.3:LR(0)找出句柄前綴,構造分析表,然后根據輸入符號進行規約。
3.4:SLR(1)使用LR(0)時若有沖突,不知道規約,移進,活移進哪一個,所以需要向前搜索,則只把有問題的地方向前搜索一次。
3.5:LR(1) 在每個項目中增加搜索符;舉個列子如有A->α.Bβ,則還需將B的規則也加入。
3.6:.LALR(1)就是假如兩個產生式集相同則將它們合並為一個,幾合並同心集。

四 總結

見到First集就移進,見到Follow集就歸約。

LR(0):見到First集就移進,見到終態就歸約

SLR(1)見到First集就移進,見到終態先看Follow集,與Follow集對應的項目歸約,其它報錯。

SLR分析法包含的展望信息是體現在利用了Follow(A)信息,可以解決“歸約-歸約”沖突

SLR分析法沒有包含足夠的展望信息,不能完成解決“移進-歸約”沖突,需要改進。

LALR同心集合並不會產生“移進-歸約”沖突 ,但會產生“歸約-歸約”沖突

下面是LR(0),SLR(1),LALR(1),LR(1)文法處理能力的比較,圓圈越大說明能力越強。

 

 reference:

https://blog.csdn.net/acmdream/article/details/53375104

https://www.cnblogs.com/Alexkk/p/6033159.html?utm_source=itdadao&utm_medium=referral

http://www.cnblogs.com/sunshine-zzl/p/6719831.html

https://www.jianshu.com/p/26ddfa61d172


免責聲明!

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



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