編譯原理--01 文法和語言、詞法分析複習(清華大學出版社第3版)

前言

這篇博客系列是我爲了應付期末編譯原理的考試順便作的複習總結。不過如今考試已經結束了,作了不到半個鍾就作完卷子了。到頭來考的深度也只有裏面的一半左右= =不過至少是考點全覆蓋了23333html

最後考了95分嘿嘿,甚至還有考100的閉包

目錄
01 文法和語言、詞法分析複習
02 自頂向下、自底向上的LR分析複習
03 語法制導翻譯和中間代碼生成複習
04 符號表、運行時存儲組織和代碼優化複習

第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\)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不在任何規則的右部出現,即不可到達的

這一章的可能考點

  1. 已知文法求語言
  2. 已知語言求文法
  3. 列出句型的短語、直接短語、句柄
  4. 語法樹、最左推導、規範推導

第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的最小化

  1. \(P\)劃分爲終態集非終態集,得\(P'=\{N,T\}\)
  2. 遞歸地分割\(P'\)中的子集,使得被分割的子集中的全部狀態都可以根據不一樣的輸入符號轉換到被分割的目標子集中的全部狀態
  3. 直到不可再被分割後,將\(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'\)

正規式和有窮自動機的等價性

正規文法和有窮自動機的等價性

這一章的可能考點

  1. 根據文法構造DFA,或給定NFA轉DFA
  2. DFA的最小化
  3. 正規文法、正規式、有窮自動機之間的轉換
相關文章
相關標籤/搜索