當前位置:首頁 » 編程軟體 » lr編譯原理

lr編譯原理

發布時間: 2023-07-06 11:37:03

編譯原理——LR分析表

自底向上的語法分析

LR分析表的結構如上,其分為兩個部分 Action Goto

兩個參數狀態i,終結符號a(s(i)代表第i個狀態,r(i)代表第i條表達式)

Goto[i,A]=j

文法

容易得知這個文法可以推出 0 1 00 01 等的字元串。因為它是 左遞歸 。不適用於 LL 文法分析,只能使用 LR 分析。

因為本題入口有兩個—— S → L·L S → L ,所以需要構造額外的產生式 S'->S

2.1 第一次遍歷

我們從 [S -> . L·L] 開始,構造這個狀態的閉包,也就是加上所有能從這個產生式推出的表項。

首先,判斷 . 後面是否為 非終結符號A 。如果是,那我們就得找所有由 A-> 推出的產生式,並將它們添加進入 閉包 里(也就是State包里)。循環做即可。

因此我們可以得到 State 0 有

下一步,就是我的 . 往下一位移動。對每個符號X後有個 . 的項,都可以從 State 0 過渡到其他狀態。

由以上6條式子可以得知下一位符號可以是 S L B 0 1 。所以自然可以得到5個狀態。

State 1 是由 State 0 通過 S 轉移到這里的,所以我們找出所有 State 0 中在 S 前有 . 的項。

此狀態作為結束狀態 Accept ,不需要繼續狀態轉移了。

State 2 是由 State 0 通過 L 轉移到這里的,所以我們找出所有 State 0 中在 L 前有 . 的項。

S -> . L·L S -> . L L -> . LB

有3條式子,現在我們將 . 向後推一格,就得到 State 1 的項了。

但是 . 之後的符號分別是 · $ B , B 為非終結符號,我們得包含 B -> 的項

State 3 是由 State 0 通過 B 轉移到這里的,所以我們找出所有 State 0 中在 B 前有 . 的項。

因為 . 後沒有其他符號了,因此這個狀態不需要繼續轉移了。

State 4 是由 State 0 通過 0 轉移到這里的,所以我們找出所有 State 0 中在 0 前有 . 的項。

因為 . 後沒有其他符號了,因此這個狀態不需要繼續轉移了。

很簡單,同樣的道理找 State 5

State 5 是由 State 0 通過 1 轉移到這里的,所以我們找出所有 State 0 中在 1 前有 . 的項。

因為 . 後沒有其他符號了,因此這個狀態不需要繼續轉移了。

好的,現在我們第一次遍歷完成。

2.2 第二次遍歷

第二次遍歷自然從 State 2 開始。

我們回到 State2 ,可以看出 . 之後的符號有 · B 0 1 。

State 6 是由 State 2 通過 · 轉移到這里的,所以我們找出所有 State 2 中在 · 前有 . 的項。

S -> L. ·L 只有1條,我們往後移發現 L 又為非終結符號,參考 State 0 做的操作,我們得找出所有的式子。

共有5條式子,共同組成 State 6 ,由上面的式子可以看出我們還得繼續下一次遍歷。先不管著,我們進行下一次狀態查找。

State 7 是由 State 2 通過 B 轉移到這里的,所以我們找出所有 State 2 中在 B 前有 . 的項。

L -> L. B 也是只有1條,我們往後移發現沒有非終結符號了,那就不需要再繼續添加其他式子了。

這個狀態也不需要繼續進行轉移了。

接下來很關鍵,因為我們通過 State2 的 . 後的符號找出了 State 6 State 7 ,接下來還差符號 0 1 ,那麼是否像之前一樣按例添加狀態呢, 答案是不是的 ,因為我們發現通過 0 1 找到的閉包集分別是 B -> 0 B -> 1 ,這與我們的之前的 State 4 State 5 相同。所以我們得將其整合起來,相當於 State 2 通過 0 1 符號找到了 State 4 State 5 狀態。

2.3 第三次遍歷

回頭看第二次遍歷,可以看出只有 State 6 可以進行狀態轉移了。

那麼就將 State 6 作為第三次遍歷的源頭,可以看出 . 之後的符號有 L B 0 1 。

State 8 是由 State 6 通過 L 轉移到這里的,所以我們找出所有 State 6 在 L 前有 . 的項。

S -> L· .L L -> . LB 有兩條式子,往後移發現有非終結符號 B ,所以經過整合可以得到

可以看出 . 的後面還有一個符號,所以這里我們還得再進行一次遍歷。

接下來,又是遇到重復的包的情況,可以看出我們由 State 6 通過 B 0 1 得到的閉包分別是 L->B B->0 B->1 ,很明顯,這分別對應於 State 3 State 4 State 5 。

第三次遍歷也就結束了。

2.4 第四次遍歷

回看第三次遍歷,可以看出只有 State 8 可以進行狀態轉移,其 . 之後的符號分別是 B 0 1 。

誒,感覺很熟悉,就是上面幾行剛說的情況,也就是說通過這三個符號找到的閉包是我們之前遇到的狀態,分別是 State 3 State 4 State 5 。

做到這里,我們發現我們已經全部遍歷完畢!

總共有8個狀態,通過以上流程做成個圖是什麼樣子的?來看看!

這么一看就很清晰明了了,我們就可以通過這個圖做出我們的 LR分析表

其實就是我們之前呈現的表

在狀態 I2 和 I8 中,既有 移入 項目,也有 規約 項目,存在 移入 - 規約的沖突 ,所以不是 LR(0) 文法,但是因為 FOLLOW(S) {0, 1} = ∅,所以可以用 FOLLOW 集解決沖突,所以該文法是 SLR(1) 文法。

上表我們發現還有 r1,r2,r3 等。這個其實就是代表狀態停止轉移時為 第幾條表達式 ,r3代表第三條表達式 L -> LB 。

當我們構建了表之後,我們如何運用起來呢?

下面我們通過一個例子來說明

以上字元串是如何被SLR分析器識別的呢?

⑵ 一個關於編譯原理中LR(1)文法的問題

當·到達最後的時候就可以規約了,當·沒到最後就移入,實際中句子的下一個字元是什麼是確定的,比如在狀態|1,此時句子結束,相當於下一個字元是#,按G->S·#移入,形成G->S#·可以規約;如果在狀態|1,下一個字元是(,就按S->S·(S)#/(移入,這里不存在沖突
展望符的作用是,當同一個狀態里有兩個產生式都可以規約的時候,句子下一個字元與哪個產生式的展望符相同就按哪個規約

⑶ 編譯原理中,算符優先文法和LR文法什麼關系

算符優先分析法比LR分析(規范歸約)法的歸約速度快。在LR分析一章的語法分析器自動生成工具Yacc中,對算數表達式的歸約往往會用到算符優先關系的概念。算符優先分析的缺點是對文法有一定的限制,在實際應用中往往只用於算數表達式的歸約。由於算符優先分析不是規范歸約,所以可能把不是文法的句子錯誤的歸約成功

⑷ 編譯原理中LR(1) 那個向前搜索符怎麼求的 跪求高手解答 復制粘貼或者答非所問的別來

1、首先第一步就是項目[S』-> . S,],自動生成搜索符],自動生成搜索符],自動生成搜索符,從項目[A->α.Bβ,?]生成項目[B->…,first(β)]。


⑸ 編譯原理lr0和slr1的區別

語法分析有自上而下和自下而上兩種分析方法其中自上而下:遞歸下降,LL(1)自下而上:LR(0),SLR(1),LR(1),LALR(1)

LR需要構造一張LR分析表,此表用於當面臨輸入字元時,將它移進,規約(即自下而上分析思想),接受還是出錯。
LR(0)找出句柄前綴,構造分析表,然後根據輸入符號進行規約。 SLR(1)使用LR(0)時若有沖突,不知道規約,移進,活移進哪一個,所以需要向前搜索,則只把有問題的地方向前搜索一次。 LR(1)1.在每個項目中增加搜索符。2.舉個列子如有A->α.Bβ,則還需將B的規則也加入。 LALR(1)就是假如兩個產生式集相同則將它們合並為一個,幾合並同心集。

⑹ 編譯原理中LR(1) 那個向前搜索符怎麼求的 跪求高手解答(別只是按照書抄)

初始項目集中,約定第一個項目S′→ ·S,# 向前搜索符為#(#是句子結束標志,有的書採用的是其他符號)
其他項目的向前搜索符同CLOSURE有關,需要求FIRST集合。
詳細內容只能先去看書,然後看例題,再做些習題

⑺ 編譯原理筆記17:自下而上語法分析(4)LR(0)、SLR(1) 分析表的構造

(移進項目就是指圓點右邊是終結符的項目,規約項目指的就是圓點在右部最右端的項目)

LR(0) 文法可以直接通過識別活前綴的 DFA 來構造 LR 分析表

假定 C = {I 0 , I 1 , ... , I n } (aka. LR(0) 項目規范族、DFA 狀態集)

首先為文法產生式進行編號,拓廣文法的產生式要標記為 0(這里就是後面分析表中 rj 的產生式編號 j 的由來)

然後令每個項目集 I k 的下標 k 作為分析器的狀態(行首),包含 S' → .S 的集合下標為分析器的初態(也就是 DFA 的初態,一般都是 0 )。

下面用一個例子來說明 ACTION、GOTO 子表的構造:

SLR(1) 為解決沖突提出了一個簡單的方法:通過識別活前綴的 DFA 和【簡單向前看一個終結符】構造 SLR(1) 分析表。

如果我們的識別活前綴的 DFA 中存在移進-規約沖突、規約-規約沖突,都可以嘗試使用這個方法來解決沖突。(這里說【嘗試】,當然是因為 SLR 也只能解決一部分問題,並不是萬能的靈丹妙葯。。)

這里,我們拿前面那個 LR(0) 解決不了的文法來舉例

該文法不是 LR(0) 文法,但是是 SLR(1) 文法。

觀察上圖 DFA 中的狀態2,想像當我們的自動機正處於這個狀態:次棧頂已經規約為 T 了,棧頂也是當前的狀態 2 ,而當前剩餘輸入為 *。

如果這個自動機不會【往前多看一步】的話,那麼對處於這個狀態的自動機來說,看起來狀態 2 中的移進項目和規約項目都是可選的。這就是移進-規約沖突。

想要解決這個沖突,就輪到【往前多看一步】上場了——把當前剩餘輸入考慮進來,輔助進行項目的選擇:

對其他的沖突也使用同樣的方法進行判斷。

這種沖突性動作的解決辦法叫做 SLR(1) 解決辦法

准備工作部分,與 LR(0) 分析表的構造差不多:同樣使用每個項目集的狀態編號作為分析器的狀態編號,也就同樣用作行下標;同樣使用拓廣文法產生式作為 0 號產生式。

填表也和 LR(0) 類似,唯一的不同體現在對規約項的處理方法上:如果當前狀態有項目 A → α.aβ 和 A → α. ,而次棧頂此時是 α 且讀寫頭讀到的是 a,那麼當且僅當 a∈FOLLOW(A) 時,我們才會用 A → α 對 α 進行規約。

如果構造出來的表的每個入口都不含多重定義(也就是如上圖中表格那樣的,每個格子裡面最多隻有一個動作),那麼該表就是該文法的 SLR(1) 表,這個文法就是 SLR(1) 文法。使用 SLR(1) 表的分析器叫做一個 SLR(1) 分析器。

任意的二義文法都不能構造出 SLR(1) 分析表

例:懸空 else

例:

這里的 L 可以理解為左值,R 可以理解為右值

經過計算可以確定其 DFA 如下圖所示。

在 狀態4 中,由於 "=" 同時存在於 FOLLOW(L) 與 FOLLOW(R) 中,因此該狀態內存在移進-規約沖突,故該文法不是 SLR(1) 文法。

這樣的非二義文法可以通過增加向前看終結符的個數來解決沖突(比如LL(2)、LR(2))但這會讓問題更加復雜,故一般不採用。而二義文法無論向前看多少個終結符都無法解決二義性。

⑻ 編譯原理中,LR(0)文法的項目集規范族的I0,I1,I2,I3…………是怎麼求的~

先舉個例子:

}

將其命名為I1。

其他可類似推出。

熱點內容
bin存儲 發布:2025-02-07 20:00:50 瀏覽:202
android載入界面 發布:2025-02-07 19:55:28 瀏覽:870
好礦雲伺服器 發布:2025-02-07 19:54:31 瀏覽:948
java電話簿 發布:2025-02-07 19:49:26 瀏覽:796
超級腳本製作 發布:2025-02-07 19:31:30 瀏覽:486
怎麼查看支付寶的賬號密碼 發布:2025-02-07 19:26:48 瀏覽:16
惠普伺服器查看ip指令 發布:2025-02-07 19:26:47 瀏覽:434
演算法設計模式 發布:2025-02-07 19:15:52 瀏覽:746
伺服器1u能連接幾台電腦 發布:2025-02-07 18:50:02 瀏覽:154
立人編譯 發布:2025-02-07 18:48:32 瀏覽:766