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

2022-07-03 06:00:11 字數 2901 閱讀 2042

**於

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

如果是錯誤串呢?

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

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

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

上回把文法的lr 0 專案集規範族搞了半天,革命進行了一半。鼓搗了半天整了一堆專案集規範族出來,總是有用的呀,接下來就是在那堆的基礎上構造分析表了,構造好分析表就能分析輸入串了。本文主要講lr 0 分析表的構造和輸入串分析過程。我這個菜雞都覺得是通!俗!易!懂!的!憋說話往下看 多的不扯,博 cai...

編譯原理項集規範族(初步)

includeusing namespace std int norterminal char c struct lr int main 變為增廣文法 string s z s strn 0 0 s strn.insert strn.begin s for int i 0 iif nortermin...

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

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