编译原理--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. 正规文法、正规式、有穷自动机之间的转换
相关文章
相关标签/搜索