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

2021-08-14 14:44:38 字數 1692 閱讀 5200

學編譯原理的時候,感覺什麼ll(1)、lr(0)、slr(1)、lalr(1)思想滿天飛。

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

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

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

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

現在得到了乙個拓廣文法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)分析表的構造,本文就「請看下回分解」了。

編譯原理中LR 0 專案集規範族的構造

此文略長。我也沒想到這寫起來這麼多,但對構造過程絕對清楚,一步步慢慢看吧。lr的第乙個l和ll的第乙個l含義相同,即從左到右掃瞄句子 第二個r表示right most最右推導。在通常的描述中,後面還有乙個括號裡面的數字如,lr 0 lr 1 這樣,括號裡面的數字表示用於決策所需的後續token分詞數...

編譯原理中LR 0 專案集規範族的構造

lr的第乙個l和ll的第乙個l含義相同,即從左到右掃瞄句子 第二個r表示right most最右推導。在通常的描述中,後面還有乙個括號裡面的數字如,lr 0 lr 1 這樣,括號裡面的數字表示用於決策所需的後續token分詞數。首先看一下lr分析器的模型圖 可惜看出,lr分析器最關鍵的部分就是 lr...

編譯原理中LR 0 專案集規範族的構造

此文略長。我也沒想到這寫起來這麼多,但對構造過程絕對清楚,一步步慢慢看吧。lr的第乙個l和ll的第乙個l含義相同,即從左到右掃瞄句子 第二個r表示right most最右推導。在通常的描述中,後面還有乙個括號裡面的數字如,lr 0 lr 1 這樣,括號裡面的數字表示用於決策所需的後續token分詞數...