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

2021-07-12 00:57:16 字數 1505 閱讀 9287

此文略長。我也沒想到這寫起來這麼多,但對構造過程絕對清楚,一步步慢慢看吧。

lr的第乙個l和ll的第乙個l含義相同,即從左到右掃瞄句子 ,第二個r表示right most最右推導。

在通常的描述中,後面還有乙個括號裡面的數字如,lr(0)、lr(1)這樣,括號裡面的數字表示用於決策所需的後續token分詞數。

首先看一下lr分析器的模型圖

可惜看出,lr分析器最關鍵的部分就是 lr分析表了,而lr分析表的構建是由已構造出的lr(0)專案集規範族來進行構造的。lr分析法貌似是不要求掌握的,而且這部分比我想象的還要複雜,今天看了好多。才勉強搞清楚這個專案集規範族的構造,但是用來鍛鍊思維確實不錯啊。

專案集,那麼字面上看就是專案的集合了,專案是什麼呢。這個也確實不好說,書上是說在文法g中每個產生式的右部適當位置新增乙個圓點構成lr(0)專案,舉個例子吧。

比如對於

a->xyz

這條產生式可以構造的lr(0)專案就有4個

a->.xyz    a->x.yz    a->xy.z     a->xyz.

這樣很清楚了吧,就是用.分割。這個分割產生的四個專案在進行真正的語法分析的時候對應不同的操作,比如規約還是移位。這裡不討論。重點是專案集規範族的構造,

在知道了lr(0)專案後,可以來看看專案集規範族的定義,

對於構成識別乙個文法活字首的dfa專案集(狀態)的全體我們稱之為這個文法的lr(0)專案集規範族。至於什麼是活字首呢,定義如下

對於任一文法g[s],若s』經過任意次推導得到αaω,繼續經過一次推導得到αβω,若γ是αβ的字首,則稱γ是g的乙個活字首。

現在知道了lr(0)專案,了解了活字首,和專案集規範族的定義,還須引入lr(0)專案集的閉包函式closure和狀態轉換函式go兩個概念,先給出數學上的定義,如果你覺得麻煩可以跳過,後面會給出一道例題。

① 閉包函式closure(i)的定義如下:

a)i的專案均在closure(i)中。

b)若a→α·bβ屬於closure(i),則每一形如b→·γ的專案也屬於closure(i)。

c)重複b)直到不出現新的專案為止。即closure(i)不再擴大。

② 轉換函式go(i,x)的定義:

go(i,x)=closure(j)

其中:i為包含某一項目的狀態,就是前面我們說的那四個了。,x為一文法符號,x∈(vn∪vt),j=。

這樣就可以使用閉包函式和轉換函式構造文法g′的lr(0)專案集規範族,其步驟如下:

a)置專案s′→·s為初態集的核,然後對核求閉包,closure()得到初態的專案集。

b)對初態集或其它所構造的專案集應用轉換函式go(i,x)=closure(j),求出新狀態j的專案集。

c)重複b)直到不出現新的專案為止。

開始拿個例題來說明,定義沒例題看起來看難了。

例題:對於下列文法,s→as|bs|a,構造該文法的lr(0)專案集規範族

參考:

編譯原理中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分詞數...

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

學編譯原理的時候,感覺什麼ll 1 lr 0 slr 1 lalr 1 思想滿天飛。而且做題的時候,一不留意,一道題就寫了三頁紙了。就拿今天這個玩意兒來講,我真的是考試前花了最多的時間,搞懂了 差不多搞懂了 這是個什麼玩意兒。以下內容,做題的話應該夠了而且很!容!易!理!解!其他學術情況恕博主也是個...