編譯原理根據項目集規范族構造LR(0)分析表


轉載於https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3

上回把文法的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是該文法的產生式。

如果是錯誤串呢?

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

菜雞寫篇博客挺不容易的委屈

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


免責聲明!

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



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