1. 程式人生 > >編譯原理LR(0)專案集規範族的構造詳解

編譯原理LR(0)專案集規範族的構造詳解

學編譯原理的時候,感覺什麼LL(1)、LR(0)、SLR(1)、LALR(1)思想滿天飛。

而且做題的時候,一不留意,一道題就寫了三頁紙了。

就拿今天這個玩意兒來講,我真的是考試前花了最多的時間,搞懂了(差不多搞懂了)這是個什麼玩意兒。

以下內容,做題的話應該夠了而且很!容!易!理!解!,其他學術情況恕博主也是個菜雞。

廢話就不多扯了,能搜到看到這篇文章的小夥伴也不容易,挺有緣的,根據步驟想參考資料的話,就拿出你的《編譯原理第二版·清華大學出版社》吧,第二版哦!我也不知道第三版一不一樣,反正頁數好像是不一樣。

我這裡就用書上現成的例子了吧,第二版的7.2.4 LR(0)專案集規範族的構造這節本身其實寫得很詳細很學術很看不懂。大概跟本文有關而且有意思很重要的內容是這樣的:

現在得到了一個拓廣文法G'(前面有介紹怎麼求,很簡單就加個S'的規則就行),好這勢必是一個好的開頭。

S'->E

E->aA | bB

A->cA | d

B->cB | d

接下來求文法的專案,這個也簡單,就給每個規則加一個點以後然後挪位置,挪一個位置就得到一個專案,操作完了以後你就得到了一堆專案,這就是你接下來要面對的核心的東西了。

1.S'->·E   2.S'->E·   3.E->·aA   4.E->a·A   5.E->aA·   6.A->·cA   7.A->c·A   8.A->cA·   9.A->·d

10.A->d·   11.E->·bB   12.E->b·B   13.E->bB·   14.B->·cB   15.B->c·B   16.B->cB·   17.B->·d   18.B->d·

有關CLOSURE閉包的構造和轉向函式GOTO(I,X)的定義小夥伴們自己看書吧,說實話你要真讓我複述定義我也半吊子,但內涵理解了就做題沒毛病了。不過還是要提到一個“核”的概念,你可以理解為那張圖的每一個狀態最頭上那條規則。

接下來構造專案集規範族那張圖的步驟是這樣的:

把有S'的專案而且點在最左邊的專案作為狀態I0的核,放在開頭。然後看這個點後面的非終結符,是個E,接下來就去專案中找左部是E的而且點在最左邊開頭位置的專案,列在核的下面,這就是狀態I0了,你可以畫個框框然後標記一下。


接下來還是先看核裡面點後的這個非終結符E,輸入E(你可以理解為在箭弧上標了個E),把點向後移一位,得到S'->E·,這其實是得到了一個新的狀態的核。當然另外兩個也一樣,輸入點後面的符號,比如輸入a得到E->a·A為核的新狀態,輸入b得到E->b·B為核的新狀態。得到新狀態的核了,就順便把這個狀態剩下的專案也列出來吧,就是看核的點後面的非終結符,找以這個非終結符為左部的點在最左邊的專案。當然要是點後面沒有東西就不用找了,新的狀態記得標號哦。


其實,講到這裡專案集規範族的構造方法部分就!完!了!接下來就是重複上面的工作,從每一個新狀態出發,逐個輸入每個專案點後面的符號,就是後移一位,又分別作為新的狀態的核然後根據核找下面的同狀態裡的專案。找到找不動為止。比如我再找一個I2後面的試試:


當你求出整張圖的時候,恭喜你萬里長征走完第一步了,後面可能涉及到的LR(0)分析表的構造,本文就“請看下回分解”了。

菜雞寫篇部落格挺不容易的!委屈如果內容有誤請小夥伴在下方評論區指點......