1. 程式人生 > >編譯原理根據專案集規範族構造LR(0)分析表

編譯原理根據專案集規範族構造LR(0)分析表

上回把文法的LR(0)專案集規範族搞了半天,革命進行了一半。

鼓搗了半天整了一堆專案集規範族出來,總是有用的呀,接下來就是在那堆的基礎上構造分析表了,構造好分析表就能分析輸入串了。本文主要講LR(0)分析表的構造輸入串分析過程

我這個菜雞都覺得是通!俗!易!懂!的!!

憋說話往下看->

多的不扯,博(cai)主(ji)我使用的是清華大學出版社的《編譯原理第二版》,第二版哦,不知道第三版的小夥伴內容是不是一樣的,頁數好像不一樣我記得。在LR分析這一章的第二節後面,就是有專案集規範族那張圖那兒,我們還是以那個文法為主題講。

為了方便我直接為大家列好啦~


OK,這是上回我們構造好的專案集規範族,在構造分析表之前我們先畫好分析表

先寫好ACTION和GOTO兩個列標題,然後在ACTION下面寫一排文法的所有的終結符,別忘了還有#,GOTO下面寫文法中除了S'以外的所有的非終結符。


OK,接下來是這樣的,書上也有詳細的關於分析表構造演算法的解釋,說白了,其意思應該是這樣的:

1、找專案集規範族有S'->A·這種形狀的那個狀態Ik,就是第k個狀態,則把分析表第k行的#列標上acc

2、按順序(我一般是按狀態序號順序)分析狀態的專案和GOTO函式,主要就是看每個專案的點後面的符號

(1)要是是個終結符,看輸入這個終結符後去的哪個狀態,比如當前是狀態I0,對於第二個專案E->·aA,輸入a以後去了狀態I2,那就在分析表中第0行的a列寫上S2,意思就是狀態Ik輸入Vt後去了Ij狀態。

(2)要是是個非終結符,這個更好理解,比如從狀態Ik輸入這個非終結符以後去了狀態Ij,那就在GOTO表的第k行第Vn列寫j。

3、你會發現有的專案的點是在最後,這就是分析表裡面那些小r的來歷了。先看這個專案所在的狀態,再看點前面的規則是文法裡面的第幾個規則,比如說狀態I10的A->d·裡面的A->d就是文法的第4條規則,那就在分析表的第10行所有的終結符列包括#列寫上r4,就是ACTION列的一行寫滿。即狀態Ik的專案來自於文法的第j條規則,則分析表的第k行都是rj。

我們具體試試吧:

1、先找acc,以免高興過頭了忘記。狀態I1裡面有S'->E·,所以acc在第1行。


2、按順序開始看I0,第一個專案點後面是非終結符E,輸入E前往狀態I1,所以GOTO表的第0行第E列寫1。第二個專案點後面是a,輸入a以後前往I2,則ACTION表第0行第a列寫S2。第三個專案點後面是b,輸入b後前往I3,則ACTION表第0行第b列寫S3。


3、狀態I1有acc了,不管了。跳過看I2。同理,輸入A的時候改GOTO表,輸入c和d的時候改ACTION表,而且都是寫S形式的。你會發現一直到I5都是這樣。


4、狀態I6,這是個點在最後面的專案,看前面的規則,是文法的第1個規則,那第6行就寫一行r1。狀態I7,點前面的規則是文法的第2條規則,則第7行寫一行r2。同理到狀態I11。


到這裡該文法的LR(0)分析表就!構!造!完!了!

是不是很心累,要是看書看不懂聽課犯糊塗更心累!別問我為啥知道......

順便說說這個表又是拿來幹嘛的吧,搞了半天當然是有用的有實際價值的是符合社會發展所需要求的。

輸入串的分析過程,在實際的分析程式裡面還有兩個重要的輔助英雄角色,狀態棧和符號棧。要是做題的話就寫在草稿紙上吧,考試的時候應該也不會讓你分析超長的串。分析前先往狀態棧壓一個0進去,符號棧壓一個#進去,輸入串最後加個#。

比如我要分析bccd,書上也有例子。

當前輸入串bccd#,即將輸入b,看狀態棧頂,是0,去看分析表,第0行第b列是S3,不是r什麼什麼。好,把角標3壓狀態棧,b壓符號棧,輸入串少一個。

當前為ccd#,即將壓c,狀態棧頂為3,看分析表第3行第c列,是S5,好,5和c分別壓棧。

當前為cd#,即將壓c,狀態棧頂為5,看分析表第5行第c列,是S5,好,5和c分別壓棧。

當前為d#,即將壓d,狀態棧頂為5,看分析表第5行第d列,是S11,好,11和d分別壓棧。

當前為#,即將壓#,狀態棧頂為11,看分析表第11行第#列,是r6。好,歷史走到了轉折點。趕緊去看文法的第6條規則,把符號棧頂歸約為B,狀態棧頂11彈出。然後再看狀態棧頂5和符號棧頂B,GOTO表第5行第B列是9,記得在分析過程這一步的GOTO寫9,然後把9壓狀態棧。這裡要分清棧操作的先後順序。

當前為#,即將壓#,狀態棧頂為9,看分析表第9行第#列,是r5,好,同上一個步驟找規則歸約掉然後壓棧,然後找GOTO表把新狀態壓棧。

重複上面的操作。

最後一步是這樣的,狀態棧頂為1,即將壓#,分析表第1行第#列為acc,至此分析結束,bccd是該文法的產生式。

如果是錯誤串呢?

你放心,早做不下去了,崩了。

菜雞寫篇部落格挺不容易的委屈

如果內容有誤請小夥伴們在下方評論區指出