轉載於https://blog.csdn.net/johan_joe_king/article/details/79051993#comments
學編譯原理的時候,感覺什么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)分析表的構造,本文就“請看下回分解”了。
菜雞寫篇博客挺不容易的!如果內容有誤請小伙伴在下方評論區指點......