編譯原理 LL,LR,SLR等分析

2021-09-23 22:35:41 字數 2653 閱讀 3279

考完編譯原理有一段時間了,記得當時都被以上這五種文法搞懵了,所以希望寫篇文章幫助那些正在學習的人。以下內容是依據龍書中文版講解的,由於老師不同可能某些地方大同小異,如有什麼紕漏之處還請指出,多謝~

首先來看張圖,上圖是四種文法的包含關係,即 lr(1)文法範圍最大,而 lr(0)文法範圍最小。同時也說明了四種文法分析過程的強弱,即 lr(1)文法分析最強,而 lr(0)文法分析最弱。

那為什麼沒有 ll(1)文法呢?因為它和上面的四種文法是不同的。

ll(1)分析法是自上而下的分析法。lr(0),lr(1),slr(1),lalr(1)是自下而上的分析法。

自上而下:從開始符號出發,根據產生式規則推導給定的句子。用的是推導。

自下而上:從給定的句子規約到文法的開始符號。用的是歸約。

下面就主要來講解他們的不同點, ll(1)單獨講,其他四種文法分析過程基本有三大步:寫出自動機(即 lr(0)或 lr(1)項集族,後面都稱作自動機) -> 構造文法分析表-> 進行文法分析過程。其中後兩步都是類似或者說幾乎完全一樣的,第一步中的自動機有兩種: lr(0)自動機和 lr(1)自動機。lr(0) 和 slr文法分析用的是 lr(0)自動機,lr(1)和 lalr文法分析用的是 lr(1)自動機。而lr(1)自動機構造方法和lr(0)自動機的構造方法相同,只是多增加了向前搜尋符號。

一、ll(1)文法分析

分析過程:

ll(1)分析又稱**分析,首先將文法拆分到最小,即不帶寫出「|」的產生式,並寫出每條產生式的 select集。       然後,針對輸入串寫出**分析表,表的最左一列為非終結符,最上一行為輸入串**現的終結符,注意要包括句子括號「#」。

然後就是進行**分析了,由於上課老師是在黑板上畫的,我又懶得寫……so……大家自己動手吧。**分析的過程和後面的 lr分析過程大體類似,最上一行應該有的項是:步驟、符號棧、剩餘串和動作。其中動作無非就是匹配和移近,當符號棧棧頂符號和剩餘串最左邊符號相同時則匹配,反之移近。由哪條產生式移近應根據上面的**分析表來決定,即符號棧棧頂的非終結符和剩餘串最左部的終結符對應的產生式。如果沒有與之對應的產生式則匹配出錯,給出的輸入串不是該文法的句子,如果匹配完畢則 acc(接受)。

ll(1)文法判定:

主要有兩種方式,一是依靠 select集,如果對於產生式左部相同的任意兩條產生式的 select集相交為空 且 兩者不能同時推出空,則是ll(1)文法。二是如果**分析表中沒有多重入口(即分析表的一格中只有乙個產生式)則為ll(1)文法。

二、lr(0)文法分析

分析過程:

首先要拓廣文法,即如果文法開頭不是乙個非終結符到另乙個非終結符的產生式則需要加入,如加入 s』->s .

然後需要構造 lr(0)自動機,就是加入了乙個圓點,圓點後的符號是即將處理的符號,如果圓點後是非終結符時,則要寫出該終結符為產生式左部的所有產生式。反覆以上過程,直到不再擴大。給它們編號並寫出讀入下乙個符號(即圓點後的符號)會跳轉到哪。

然後構造 lr(0)分析表,左側為項集族編號,上部為終結符和非終結符。中間內容表示該編號的項集族遇到非終結符應該移近還是歸約,數字為跳轉到的項集族編號,如果圓點到了產生式的最右邊則應歸約,反之移近。遇到終結符填入相應的項集編號即可。如 (0,a) 即第0行a列對應的是 s2,其意思為對於項集族 i0,如果下乙個讀入的符號為a,則移進到項集族 i2 ;又如第4行對應的都是 r1,其意思為對於項集族 i4,如果下乙個讀入的符號為乙個終結符則需要按照編號為 (1) 的產生式進行歸約;再如 (0,e) 對應的是 1,其意思為對於項集族 i0,如果下乙個讀入的符號為非終結符 e,則移進到項集族 i1.

下一步就是分析過程了,由於沒有針對這個文法的分析過程,最後面會單獨講解,下面的文法就不提分析過程的表了。幾乎都是一樣的。

lr(0)文法判定:

如果文法對應的自動機中不存在移進-歸約衝突和歸約-歸約衝突則為 lr(0)文法。換句話說lr(0)文法分析不能解決這兩種衝突,所以範圍最小。移進-歸約衝突就是在同乙個項集族中同時出現了可以移進的產生式和可以歸約的產生式。歸約-歸約衝突類似。

三、slr文法分析

分析過程:

拓廣文法、寫自動機、分析過程表與 lr(0)文法相同。但是由於可能存在移進-歸約衝突,所以 slr分析表可能存在多重入口(即同一格中既有移進又有歸約)。

slr文法判定:

slr文法不存在歸約-歸約衝突,有可能存在移進-歸約衝突,但是如果可以用 follow集解決則是 slr文法。換句話說,slr文法分析過程可以解決歸約-歸約衝突,但是不一定能解決移進-歸約衝突。用 follow集來處理即出現移進-歸約衝突的兩條產生式,如果其 follow集相交為空則為 slr文法,反之不是。當然,如果以上兩種衝突都不存在自然是了。

四、lalr文法分析

分析過程:

拓廣文法與前面一致。

由於合併了同心集,所以 lalr分析表也應該做出相應的改變,例如合併了 i3和 i6,則對應的格中應填 s36 .

lalr文法判定:

有個結論是合併同心集不會產生新的移進-歸約衝突,但是會產生新的歸約-歸約衝突,如果沒產生衝突就是 lalr 文法,反之不是。

五、lr(1)文法分析

分析過程與 lalr文法相同。

lr(1)文法判定:

因為 lr(1)文法的範圍比較大,所以文法幾乎都是 lr(1)的,現在知道的只有當合併同心集產生了歸約-歸約衝突時才只屬於lr(1)文法,而不屬於其他文法。

注意,根據最開始的那張圖可以知道,是小的文法一定是大的文法。這一點需要注意。

分析過程表:

編譯原理詞法分析

編譯原理實驗一 詞法分析練習 include include include define tokenmax 100 define progmax 1000 define k esc 27 void analytics 詞法分析 void scanner 輸入掃瞄 bool isletter cha...

詞法分析(編譯原理)

詞法分析 英語 lexical analysis 是電腦科學中將字串行轉換為單詞 token 序列的過程。進行詞法分析的程式或者函式叫作詞法分析器 lexical analyzer,簡稱lexer 也叫掃瞄器 scanner 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱...

編譯原理 文法分析

編譯原理實驗二 語法分析一 time limit 1000ms,special time limit 2500ms,memory limit 32768kb total submit users 115,accepted users 109 problem 10835 no special judg...