這篇博客系列是我爲了應付期末編譯原理的考試順便作的複習總結。不過如今考試已經結束了,作了不到半個鍾就作完卷子了。到頭來考的深度也只有裏面的一半左右= =不過至少是考點全覆蓋了23333html
最後考了95分嘿嘿,甚至還有考100的閉包
目錄 |
---|
01 文法和語言、詞法分析複習 |
02 自頂向下、自底向上的LR分析複習 |
03 語法制導翻譯和中間代碼生成複習 |
04 符號表、運行時存儲組織和代碼優化複習 |
空符號串用\(\varepsilon\)表示,長度爲0函數
若 \(\Sigma=\{0,1\}\) ,則 \(\Sigma^*=\{\varepsilon,0,1,00,11,000,001,...\}\),稱 \(\Sigma^*\) 爲集合 \(\Sigma\) 的閉包;\(\Sigma^+=\{0,1,00,11,000,001,...\}\),稱\(\Sigma^+\)爲集合\(\Sigma^+\)的正閉包。優化
規則或產生式或生成式,表示爲 \(\alpha\rightarrow\beta\) 或 \(\alpha::=\beta\)spa
文法 \(G\) 定義爲四元組 \((V_N, V_T, P, S)\)
\(V_N\)爲非終結符集合
\(V_T\)爲終結符集合
\(P\)爲規則集
\(S\)爲識別符或開始符翻譯
例如:
\(G[S]:S\rightarrow0S1\)
\(S\rightarrow01\)htm
直接推導用 \(\Rightarrow\),如 \(0S1\Rightarrow 00S11\)
長度爲\(n(n\geq1)\)的推導用 \(\stackrel{+}{\Rightarrow}\),如\(S\stackrel{+}{\Rightarrow} 000S111\)
長度爲\(n(n\geq0)\)的推導用 \(\stackrel{*}{\Rightarrow}\),如\(S\stackrel{*}{\Rightarrow} 000S111 \stackrel{*}{\Rightarrow} 000S111\)blog
句型:對\(S\stackrel{*}{\Rightarrow}x\),稱x是文法G[S]的句型。x能夠包含非終結符
句子:若上述x僅由終結符構成,則x是文法G[S]的句子遞歸
文法描述的語言 是 該文法一切句子的集合,如:
\(L(G[S])=\{0^n1^n|n\geq1\}\)get
文法類型 | 每一個產生式\(\alpha\rightarrow\beta\)的特色 |
---|---|
0型文法 | \(\alpha\in(V_N\cup V_T)^*\)且至少含一個非終結符,且\(\beta\in(V_N\cup V_T)^*\) |
1型 或 上下文有關文法 | 在0型文法的基礎上,還知足\(\mid\beta\mid\geq\mid\alpha\mid\),僅\(S\rightarrow\varepsilon\)除外 |
2型 或 上下文無關文法 | \(\alpha\)是一個非終結符,\(\beta\in(V_N\cup V_T)^*\) |
3型 或 正規文法 | 知足\(A\rightarrow aB\)或\(A\rightarrow a\)(右線性文法)的形式,即\(\beta\)中只有1個非終結符,以及0或1個終結符。左線性文法爲\(A\rightarrow Ba\)或\(A\rightarrow a\)型 |
最左推導:在推導\(\alpha\Rightarrow\beta\)中,對\(\alpha\)中最左非終結符進行替換
最右推導:又稱做規範推導,所推導獲得的句型稱爲右句型,或規範句型
二義性:一個文法存在某個句子對應兩棵不一樣的語法樹
已知文法\(G[S]:\)
\(S\rightarrow aAS\)
\(A\rightarrow SbA\)
\(S\rightarrow a\)
\(A\rightarrow ba\)
文法G的句型aabbaa的一顆推導樹爲:
短語:若\(S\stackrel{*}{\Rightarrow}\alpha A\delta\) 且\(A\stackrel{+}{\Rightarrow}\beta\),則稱 \(\beta\) 爲句型 \(\alpha A\delta\) 相對於非終結符\(A\)的短語
直接短語:特別的,若\(A\Rightarrow \beta\),則稱 \(\beta\) 爲句型 \(\alpha A\delta\) 相對於規則\(A\rightarrow \beta\)的直接短語
句柄:規範句型(右句型)的直接短語。對於無二義文法,一個右句型的惟一句柄是其全部直接短語中最左邊的那一個
短語即找出全部非終結符爲根節點構成的子樹的葉子節點,故有\(a, ba, abba, aabbaa\)
直接短語即找出全部非終結符爲根節點構成的只有兩層高度子樹的葉子節點,故有\(a, ba\)
句柄要求使用最右推導,對上面的推導樹來看有\(S\Rightarrow aAS\Rightarrow aAa\Rightarrow aSbAa\Rightarrow aSbbaa\Rightarrow aabbaa\),咱們須要看的是最後一次推導,這裏使用的是\(S\rightarrow a\),所以其句柄爲:\(a\)。
可見,短語、直接短語、句柄的存在要求語法樹至少含有2級的葉結點(或3層高度)。
有害規則:如\(U\rightarrow U\),只會引起二義性
多餘規則:非終結符D不在任何規則的右部出現,即不可到達的
正規式 | 含義 |
---|---|
\(a\) | 僅a |
\(a\mid b\) | 該字符能夠爲a或b |
\(ab\) | 字符a後面緊跟b |
\(a^*\) | n(n>=0)個連續的a |
\((a\mid b)b\) | ab或bb |
正規式轉化爲正規文法
對\(A\rightarrow x^*y\)型正規產生式,重寫爲:
\(A\rightarrow xB\)
\(A\rightarrow y\)
\(B\rightarrow xB\)
\(B\rightarrow y\)
對\(A\rightarrow x\mid y\)型正規產生式,重寫爲:
\(A\rightarrow x\)
\(A\rightarrow y\)
正規文法轉化爲正規式
文法產生式 | 正規式 | |
---|---|---|
規則1 | \(A\rightarrow xB\) 和 \(B\rightarrow y\) | \(A=xy\) |
規則2 | \(A\rightarrow xA\mid y\) | \(A=x^*y\) |
規則3 | \(A\rightarrow x\) 和 \(A\rightarrow y\) | \(A=x\mid y\) |
肯定的有窮自動機\(M\)是一個五元組:\(M=(K,\Sigma,f,S,Z)\)
\(K\)是一個有窮狀態集
\(\Sigma\)是一個輸入符號表
\(f\)是狀態轉換函數,例如\(f(k_i,a)=k_j (k_i,k_j\in K)\)
\(S\in K\),是惟一的一個初態
\(Z\subseteq K\),是一個終態集
DFA的肯定性表如今轉換函數 \(f:K\times\Sigma\rightarrow K\) 是一個單值函數
例如: DFA \(M=(\{S,U,V\}, \{a,b\}, f, S, \{V\})\)
\(f(S,a)=U\)
\(f(S,b)=V\)
\(f(U,b)=V\)
\(f(V,a)=U\)
現驗證\(bab\)是否爲\(M\)所接受,由於:
\(f(S, bab)=f(f(S,b), ab)=f(V,ab)=f(f(V,a),b)=f(U,b)=V\),而\(V\)屬於終態,故\(bab\)可爲\(M\)接受。
不肯定的有窮自動機\(M\)是一個五元組:\(M=(K,\Sigma,f,S,Z)\)
\(K\)是一個有窮狀態集
\(\Sigma\)是一個輸入符號表
\(f\)是\(K\times\Sigma^*\rightarrow 2^K\)的多值映像,即容許函數值有多種結果
\(S\in K\),是非空初態集
\(Z\subseteq K\),是一個終態集
NFA可使用空轉移,但DFA不能夠。例如:\(f(0, \varepsilon)=\{0,3\}\)
狀態集合\(I\)的\(\varepsilon-\)閉包,表示爲\(\varepsilon-closure(I)\),是狀態集\(I\)中的任何狀態\(S\)通過任意條\(\varepsilon\)弧能到達的狀態的集合。顯然,狀態集合\(I\)的任何狀態\(S\)都屬於\(\varepsilon-closure(I)\)
狀態集合\(I\)的\(a\)弧轉換,表示爲\(move(I,a)\),定義爲狀態集合J,其中J是全部那些能夠從\(I\)中某一狀態通過一條\(a\)弧而到達的狀態全體
子集法
初始狀態集 | \(\varepsilon-closure(I)\) | a | b |
---|---|---|---|
\(\{0\}\) | \(\{0,1,2,4,7\}\) | ||
\(T_0=\{0,1,2,4,7\}\) | \(\{3,8\}\) | \(\{5\}\) | |
\(\{3,8\}\) | \(\{1,2,3,4,6,7,8\}\) | ||
\(\{5\}\) | \(\{1,2,4,5,6,7\}\) | ||
\(T_1=\{1,2,3,4,6,7,8\}\) | \(\{3,8\}\) | \(\{5,9\}\) | |
\(T_2=\{1,2,4,5,6,7\}\) | \(\{3,8\}\) | \(\{5\}\) | |
\(\{5,9\}\) | \(\{1,2,4,5,6,7,9\}\) | ||
\(T_3=\{1,2,4,5,6,7,9\}\) | \(\{3,8\}\) | \(\{5,10\}\) | |
\(\{5,10\}\) | \(\{1,2,4,5,6,7,10\}\) | ||
\(T_4=\{1,2,4,5,6,7,10\}\) | \(\{3,8\}\) | \(\{5\}\) |
重命名狀態集 | a | b |
---|---|---|
\(T_0\) | \(T_1\) | \(T_2\) |
\(T_1\) | \(T_1\) | \(T_3\) |
\(T_2\) | \(T_1\) | \(T_2\) |
\(T_3\) | \(T_1\) | \(T_4\) |
\(T_4\) | \(T_1\) | \(T_2\) |
\(P=\{1,2,3,4,5,6,7\}\)被劃分爲\(P_0=\{\{1,2,3,4\},\{5,6,7\}\}\)
在非終態集中,在1和2構成集合時,經過a能夠到達終態集,經過b能夠到達3。而3,4經過b到達的是終態集,顯然有區別,故劃分爲\(P_1=\{\{1,2\},\{3,4\},\{5,6,7\}\}\)
在6和7構成集合時,經過a能夠到達4,經過b能夠到達集合{1,2},而5經過a到達的是7,顯然有區別,故劃分爲\(P_2=\{\{1,2\},\{3,4\},\{5\},\{6,7\}\}\)
因爲3經過a到達集合{1,2},而4經過a到達4,有明顯區分,故劃分爲\(P_3=\{\{1,2\},\{3\},\{4\},\{5\},\{6,7\}\}\)
最後不能再劃分了,所以令1表明{1,2},消去2,令6表明{6,7},消去7.最終獲得的爲最小化的DFA \(M'\)
略
略