编译原理与编译构造 由NFA变为DFA
2017-10-11 23:58
585 查看
本文主要来源于上课笔记
形如 A→aB A→a
缺点是不直观
正规表达式
采用模板,好处是直观
1) a∈RE ,ϵ 属于特殊字符,ϵ∈RE
2)if α,β is RE, α⋅β,α|β,α∗ are REs
例:ω∈(a,b)∗ ,且倒数第3个是a :
(a|b)∗a(a|b)(a|b)
词法分析:RE⇒FA⇒ 词法分析程序
FA: 状态数目有限,是一个有始有终的过程模型
FA的组成:S,Σ,s0,F,move
S 表示状态集,Σ 表示字母表,s0 表示开始状态,F 表示结束状态集/终止状态集,move 表示映射
其中,s0∈S,F⊆S
若move 是n:1/1:1 ,则是一个function ,则FA为DFA,否则FA为NFA
存在ϵ− 边
有多个后继状态
1.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/464a8eea0d54c6fe27028d92a12e8fd9.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/a7a47d019cdb2a49930ca277061f3685.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/bb412e817756bcf034444fe54317d94c.png)
第3张图是一个ϵ− 闭包
2.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/ba72f861cdeef0162aadb8296ffca648.png)
此时是一个子集构造
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/ce91d14bcede0e52fd0f87f56bad8d16.png)
I0=ϵ−c({x})
I′0={x}
I′′0=I′0⋃{5}={x,5}
I′′′0=I′′0⋃{1}={x,5,1}
I′′′′0=I′′′0⋃∅=I′′′0
此时迭代完成,知I0={x,5,1}
我们规定初始状态是I0,然后这个状态是要算出来的,因为要算闭包
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/b1a4627e23ae105b64cdb5f8a5022597.png)
I0→I1 见上图
由于{5,3,1} 这个状态不存在,我们命名为I1
最终所有的状态都应该由上面ϵ 闭包或子集构造得到。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/9692e5a9a623881e76a84aa760789ad4.png)
结论1: 最多情况下由2n−1 种状态,其中n 是一开始图中圈出来的x,1,2,3,4,5,6,y 的个数 。减去的一个是空集。
结论2:核相同,则ϵ−c 相同
if {y}⋂Ii≠∅ , 则Ii 是一个终态 。在此题中,F={I3,I4,I5,I6}
Division:
clustering(聚类)——自下而上
classifying(分类)——自上而下
在这里我们需要将Ii 以终态、非终态划分
state equivalence:
发出的边数相同
对应的标记相同(就是箭头上面的标记)
对应的后继状态等价
易见这是一个递归定义。
若两个状态相同,则两个状态等价(强等价)。
若后继状态相同,则两个状态等价(强等价)。
若后继状态属于同一个已存在的叶节点,则弱等价。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/77f2f8282ac606a5349032ce6b0e21c4.png)
由一开始的初始态和终态,得出上图。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/f67a509883c5da8bc38cd37b919fc5ab.png)
由于I0→aI1,I1→aI3,I2→aI1
此时可见I1 在左边,I3 在右边,因此将I0,I2 划分到左边,I1 划分到右边,得到上图。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/ca1d8c78137bef7bc3c89004e6a964c3.png)
同理,由b得到上图。
在每个叶节点中选一个节点,在最右边的叶节点中选I3
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/32f2fb4ac4de750ed8ae34fa33d9ea27.png)
此时整个图已经变成了这样。这也叫做the minimized DFA
RE⇒NFA⇒DFA⇒DFAo⇒program
DFAo 表示优化过的DFA
注意,需要用到look back 来检查是否之前的后继状态在同一节点而之后的后继状态不在同一节点的情况。
如下例子:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/1f510b3f275e904bbdd88f630f21f436.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/315000d3aba33c24efc551620ea7a2c2.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/b58167a10c09f5f8cd4b440fd12ee877.png)
过程略一下。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/dfa77332641e79c797a48fc2d7024552.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/02065d376bb448fc074ee7db00f8a557.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/08b9a7380fad954e1d9d54bf4ac31f35.png)
一个词法分析程序分析所有单词。
单词构造的两种方法:
正规文法形如 A→aB A→a
缺点是不直观
正规表达式
采用模板,好处是直观
1) a∈RE ,ϵ 属于特殊字符,ϵ∈RE
2)if α,β is RE, α⋅β,α|β,α∗ are REs
例:ω∈(a,b)∗ ,且倒数第3个是a :
(a|b)∗a(a|b)(a|b)
词法分析:RE⇒FA⇒ 词法分析程序
FA: 状态数目有限,是一个有始有终的过程模型
FA的组成:S,Σ,s0,F,move
S 表示状态集,Σ 表示字母表,s0 表示开始状态,F 表示结束状态集/终止状态集,move 表示映射
其中,s0∈S,F⊆S
若move 是n:1/1:1 ,则是一个function ,则FA为DFA,否则FA为NFA
由NFA变为DFA
Ncases :存在ϵ− 边
有多个后继状态
1.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/464a8eea0d54c6fe27028d92a12e8fd9.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/a7a47d019cdb2a49930ca277061f3685.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/bb412e817756bcf034444fe54317d94c.png)
第3张图是一个ϵ− 闭包
2.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/ba72f861cdeef0162aadb8296ffca648.png)
此时是一个子集构造
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/ce91d14bcede0e52fd0f87f56bad8d16.png)
I0=ϵ−c({x})
I′0={x}
I′′0=I′0⋃{5}={x,5}
I′′′0=I′′0⋃{1}={x,5,1}
I′′′′0=I′′′0⋃∅=I′′′0
此时迭代完成,知I0={x,5,1}
我们规定初始状态是I0,然后这个状态是要算出来的,因为要算闭包
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/b1a4627e23ae105b64cdb5f8a5022597.png)
I0→I1 见上图
由于{5,3,1} 这个状态不存在,我们命名为I1
最终所有的状态都应该由上面ϵ 闭包或子集构造得到。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/9692e5a9a623881e76a84aa760789ad4.png)
结论1: 最多情况下由2n−1 种状态,其中n 是一开始图中圈出来的x,1,2,3,4,5,6,y 的个数 。减去的一个是空集。
结论2:核相同,则ϵ−c 相同
if {y}⋂Ii≠∅ , 则Ii 是一个终态 。在此题中,F={I3,I4,I5,I6}
对DFA进行优化
总的思想是,减少状态数。使用的方法是,等价类划分,使用聚类的思想。Division:
clustering(聚类)——自下而上
classifying(分类)——自上而下
在这里我们需要将Ii 以终态、非终态划分
state equivalence:
发出的边数相同
对应的标记相同(就是箭头上面的标记)
对应的后继状态等价
易见这是一个递归定义。
若两个状态相同,则两个状态等价(强等价)。
若后继状态相同,则两个状态等价(强等价)。
若后继状态属于同一个已存在的叶节点,则弱等价。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/77f2f8282ac606a5349032ce6b0e21c4.png)
由一开始的初始态和终态,得出上图。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/f67a509883c5da8bc38cd37b919fc5ab.png)
由于I0→aI1,I1→aI3,I2→aI1
此时可见I1 在左边,I3 在右边,因此将I0,I2 划分到左边,I1 划分到右边,得到上图。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/ca1d8c78137bef7bc3c89004e6a964c3.png)
同理,由b得到上图。
在每个叶节点中选一个节点,在最右边的叶节点中选I3
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/32f2fb4ac4de750ed8ae34fa33d9ea27.png)
此时整个图已经变成了这样。这也叫做the minimized DFA
RE⇒NFA⇒DFA⇒DFAo⇒program
DFAo 表示优化过的DFA
注意,需要用到look back 来检查是否之前的后继状态在同一节点而之后的后继状态不在同一节点的情况。
如下例子:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/1f510b3f275e904bbdd88f630f21f436.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/315000d3aba33c24efc551620ea7a2c2.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/b58167a10c09f5f8cd4b440fd12ee877.png)
过程略一下。
RE转NFA的方法
方法1:
一些RE转NFA的规则(人喜欢的方法,也是考试时用的方法):![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/dfa77332641e79c797a48fc2d7024552.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/02065d376bb448fc074ee7db00f8a557.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/04/08b9a7380fad954e1d9d54bf4ac31f35.png)
方法2:
方法2是龙书上的算法,笔记上有,由于考试不考,实验要用,因此现在先不管。以后再说。一个词法分析程序分析所有单词。
相关文章推荐
- 【编译原理】:NFA转变为DFA的子集构造法
- 编译原理中的正则表达式、NFA和DFA
- 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——2 构造抽象语法树
- 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——4 构造DFA
- <编译原理>NFA转化DFA 及 DFA的化简
- 编译原理:有穷自动机(DFA与NFA)
- 编译原理 NFA_DFA代码实现 bfs+dfs+状态压缩 伪代码
- 编译原理:NFA转DFA
- 编译原理中的正则表达式、NFA和DFA
- 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——2 构造抽象语法树
- 个人学习笔记——编译原理:NFA DFA
- 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——2 构造抽象语法树
- 编译原理实验——将NFA转化为DFA
- [编译原理代码][NFA转DFA并最小化DFA并使用DFA进行词法分析]
- 编译原理中正则表达式直接构造DFA,DFA的最小化算法
- 【编译原理】:NFA转变为DFA的子集构造法
- 编译原理中正则表达式直接构造DFA,DFA的最小化算法
- 编译原理学习周入门教程--(9)编译程序第一个工作阶段-词法分析(NFA和DFA转换) .
- 编译原理 —— 正则->NFA->DFA->MFA (Web)
- 编译原理(二) NFA的确定化及DFA的最小化的算法及C++实现