LR(0)分析和SLR

①棧頂出現句柄時規約,否則移入。
②移入項目、代約項目、歸約項目
在這裏插入圖片描述

1.引入開始符,得到增廣文法,並且給每個式子編號。(即如果文法開頭不是一個非終結符到另一個非終結符的產生式則需要加入,如加入 S’->·S )
2.然後需要構造 LR(0)自動機,首先將增廣文法增加的產生式加入I0狀態當中,並且加入了一個圓點,圓點後的符號是即將處理的符號,然後將待處理的符號在蘊涵式左邊的字母寫出來(例如I0的E、T、F)。然後按照圓點後要處理的字母都引出一個箭頭指向下一個狀態。當S’->S·的時候,是accept(如下圖)。

在這裏插入圖片描述

3.然後構造 LR(0)分析表
在這裏插入圖片描述
規則如下:列是狀態數,action行是終結符,GOTO是非終結符。
填歸約的時候,如果已經可以規約了,那麼要在歸約的規則左部的follow集的元素裏面填上rj,其中j是之前給每個式子編的號。
在這裏插入圖片描述
4.判斷是不是LR(0)文法
如果文法對應的自動機中不存在移進-歸約衝突和歸約-歸約衝突則爲 LR(0)文法。換句話說LR(0)文法分析不能解決這兩種衝突,所以範圍最小。移進-歸約衝突就是在同一個項集族中同時出現了可以移進的產生式和可以歸約的產生式。歸約-歸約衝突類似。
(就是隻能有移入項目或者只有一個規約項目)
5.判斷是不是SLR文法
SLR文法分析過程可以解決歸約-歸約衝突,但是不一定能解決移進-歸約衝突。
所以當有出現移進-歸約衝突(接受也算歸約),要把規約的產生式左部的follow集和移進的非終結符進行相交,若空集,則衝突可解決)
LR(0)有時候在分析的時候可以不需要使用狀態轉換機,可以構建狀態轉換表。
在這裏插入圖片描述
#表示的是歸約項目達成。
SLR(1)可以構建表來分析。
在這裏插入圖片描述
其中空串不要顯示。
而且若達到歸約項目,要求出例如S0狀態的A的follow集,後繼符號裏面就是那個。

LR(0)處理輸入輸入的各個步驟

在這裏插入圖片描述
這個結合分析表會很好寫的。
首先應該明確的就是stack棧和symbols棧是相同的,二者同增同減。
輸入欄首先爲id,第一行棧值爲0,對應LR(0)自動機爲I0,I0從id到I5,所以第二行stack增加一個5。然後第二行開始,符號表增加id,action是那個項目集的產生式。然後是規約按照產生式,第三行id變成F,並且由於id彈出,stack中5也彈出,然後以0爲狀態,F是到5,所以stack中增加一個5。倒二行中,因爲symbols中減少兩個,所以stack中也減少兩個。

在這裏插入圖片描述

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