編譯原理(六)自底向上分析之LR分析法

2022-04-12 07:26:09 字數 2432 閱讀 3752

1.lr分析:從左到右掃瞄(l)自底向上進行規約(r),是規範規約,也即最右推導(規範推導),是自底向上分析方法的高度概括和集中。

2.lr(k)文法確定的分析器適用於一大類上下文無關文法的語法分析,基本上包括了所有無二義性的上下文無關文法的集合,包括了前面討論的ll(k)和算符優先文法。

3.優缺點

4.lr分析器的組成:狀態棧、分析表、控制程式。

不同的lr分析器區別在於分析表的構造方法,狀態棧和控制程式都是一樣的。

5.不同文法類層次結構

下面我們講討論lr(0)、slr(1)、lr(1)、lalr(1)。

注:三種方法對應三種分析表構造方法,三種分析表分別對應三類文法。乙個slr文法必定是lalr文法和lr文法。

1.lr分析器為乙個輸入串逆向構造了乙個最右推導。通過考慮現有符號串(句型)以及向前看未處理的前k個字元就能識別出控制代碼(最左簡單短語),成該文法為lr(k)文法。

2.活字首

規範句型:通過規範規約得到的句型。

規範句型字首:將輸入串的剩餘部分與其鏈結起來就構成了規範句型。對於復返句型 \(αβt\),\(αβ\)即是乙個字首。

活字首:對於句型 \(αβt\), \(β\) 表示控制代碼,如果 \(αβ = u1 u2 … ur\),那麼符號串u1 u2 …ui (1≤i≤r)即是句型 \(αβt\) 的活字首。

舉個例子:

3.分析表:兩個矩陣,狀態轉移表(goto表)和分析動作表(action表)。

goto表:行為分析器的狀態,列為文法符號(vn+vt)。goto[si-1, xi] = si,表示當前棧頂狀態 si-1 遇到新的棧頂符號 xi 要轉移到新的棧頂狀態 si。可以看出,goto表定義了乙個以文法符號集為字母表的有窮自動機,該自動機識別文法所有規範句型的活字首。

action表:action[ si , a ] =分析動作。分析動作有四種:移進、規約、接受。出錯。

兩個表可以融合,方便查表。

4.控制程式:根據棧頂狀態和現行輸入符號,查分析動作表(action表),執行由分析表所規定的操作;並根據goto表設定新的棧頂狀態(即實現狀態轉移)。

5.分析過程:每次規約總是規約當前句型的控制代碼,是規範規約!分析的每一步棧內符號串均是規範句型的活字首,且與輸入串的剩餘部分構成規範句型。

1.方法:根據文法構造識別規範句型活字首的有窮自動機 dfa。再由由dfa構造lr分析表。

dfa定義五元式:m = ( s, v, goto, s0, z )

s:有窮狀態集

v:文法字彙表(vn+vt)

goto:狀態轉移表對應的轉移函式

s0:初始狀態

z:終態集,在這裡除了s0以外其餘狀態都是終態。

2.dfa中的有窮狀態集s在此,s = lr(0)專案集規範族

專案集規範族:每個元素為專案組成的集合。

專案:在文法g的產生式右部某處加點的產生式,如對於產生式 \(a→xy\),有專案

\(a→.xy\) 、\(a→x.y\) 、\(a→xy.\) 三個專案。特別的,對於 \(a→ε\),存在唯一專案 \(a→.\)。

1.求解單個的專案集,對應dfa中的單個元素。

閉包運算,如果i是文法g的專案集,那麼closure(i)由一下兩條規則求得:

2.goto函式:goto(i,x)中i是專案集,x是文法符號,goto(i,x)定義為所有形如 \([a→αx.β]\)專案集的閉包,前提是 \([a→α.xβ]\) 在i中。

即有goto(i,x)= closure(j),右部分仍是專案集。直觀地說,這一步之後,找到了dfa中從狀態 \(i\) 經過 \(x\) 弧轉移到狀態 closure(j)。

引用說明

- 邵老師課堂pdf

- 《編譯原理級編譯程式構造》

自底向上分析 LR方法

lr k 表示在分析時要求向前看k個符號 即看輸入流的前k個符號 以便唯一地確定分析動作。lr k 一詞來自 left to right parse,rightmost derivation,k token lookahead。lr分析主要有lr 0 分析法,slr 1 分析法,lr 1 分析法以及...

編譯原理自底向上語法分析

lr 0 不允許移入規約衝突和歸約歸約衝突 slr 1 允許lr 0 移入規約衝突,只要歸約專案箭頭左邊字母的follow集和移入項的移入字母交集為空 也允許歸約歸約衝突,只要該狀態所有歸約專案箭頭左邊字母的follow集交集為空 lr 1 只要各個歸約專案的展望符不相交,且各個歸約專案的展望符和移...

編譯原理 LR分析(主要是LR(0)分析)

lr方法的基本思想就是,在規範歸約的過程中,一方面要記住已移進和歸約出的整個字串,也就是說要記住歷史 一方面能夠根據所用的產生式的推測未來可能碰到的輸入符號,也就是說能夠對未來進行展望。這樣,當一串貌似控制代碼的字串出現在分析棧的頂部時,我們希望能夠根據歷史和展望以及現實的輸入符號這三部分的材料,決...