这篇博客系列是我为了应付期末编译原理的考试顺便作的复习总结。不过如今考试已经结束了,作了不到半个钟就作完卷子了。到头来考的深度也只有里面的一半左右= =不过至少是考点全覆盖了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'\)
略
略