前言
這篇博客系列是我為了應付期末編譯原理的考試順便做的復習總結,不適合用於直接學習,而是用於快速過一遍考點。不過現在考試已經結束了,做了不到半個鍾就做完卷子了。到頭來考的深度也只有里面的一半左右= =不過至少是考點全覆蓋了23333
最后考了95分嘿嘿,甚至還有考100的
| 目錄 |
|---|
| 01 文法和語言、詞法分析復習 |
| 02 自頂向下、自底向上的LR分析復習 |
| 03 語法制導翻譯和中間代碼生成復習 |
| 04 符號表、運行時存儲組織和代碼優化復習 |
| 05 用C++手撕PL/0 |
第2章 文法和語言
符號和符號串
空符號串用\(\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\)
文法 \(G\) 定義為四元組 \((V_N, V_T, P, S)\)
\(V_N\)為非終結符集合
\(V_T\)為終結符集合
\(P\)為規則集
\(S\)為識別符或開始符
例如:
\(G[S]:S\rightarrow0S1\)
\(S\rightarrow01\)
直接推導用 \(\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\)
句型:對\(S\stackrel{*}{\Rightarrow}x\),稱x是文法G[S]的句型。x可以包含非終結符
句子:若上述x僅由終結符構成,則x是文法G[S]的句子
文法描述的語言 是 該文法一切句子的集合,如:
\(L(G[S])=\{0^n1^n|n\geq1\}\)
文法類型
| 文法類型 | 每個產生式\(\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不在任何規則的右部出現,即不可到達的
這一章的可能考點
- 已知文法求語言
- 已知語言求文法
- 列出句型的短語、直接短語、句柄
- 語法樹、最左推導、規范推導
第3章 詞法分析
正規式
| ----正規式---- | 含義 |
|---|---|
| \(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\) |
有窮自動機
確定的有窮自動機(DFA)
確定的有窮自動機\(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\)接受。
不確定的有窮自動機(NFA)
不確定的有窮自動機\(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\}\)
NFA轉換為等價DFA
狀態集合\(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\) |

DFA的最小化
- 將\(P\)划分為終態集與非終態集,得\(P'=\{N,T\}\)
- 遞歸地分割\(P'\)中的子集,使得被分割的子集中的所有狀態都能夠根據不同的輸入符號轉換到被分割的目標子集中的所有狀態
- 直到不可再被分割后,將\(P'\)中的每個子集合並為一個狀態。含原初態的狀態為初態,而含原終態的狀態為終態。

\(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'\)
正規式和有窮自動機的等價性
略
正規文法和有窮自動機的等價性
略
這一章的可能考點
- 根據文法構造DFA,或給定NFA轉DFA
- DFA的最小化
- 正規文法、正規式、有窮自動機之間的轉換
