自动构造词法分析器的步骤——正规式转换为最小化DFA
- 正规式——》最小化DFA
1.先把正则式——》NFA(非确定有穷自动机)
涉及一系列分解规则
2.再把NFA通过"子集构造法"——》DFA
通过子集构造法将NFA转化为DFA
将表里的变量名用比较简单的符号代替(最好是在进行构造的时候顺手在草稿纸上标记好,方便后面的工作)
对照上面的表,画出DFA的状态转换图
图中0,1,2,3,4,5都是终态,因为他们的集合里都包含了最初的终态“数字9”。
3.再把DFA通过"分割法”进行最小化
- 消除多余状态
从这个状态没有通路到达终态;S1
从开始状态出发,任何输入串也不能到达的那个状态。S2
- 合并等价状态
采用“分割法”
兼容性(一致性)条件——同是终态或同是非终态
传播性(蔓延性)条件——对于所有输入符号,状态s和状态t必须转换到等价的状态里。
DFA的最小化—例子,第一步都是固定的。分成终态和非终态
1.将M的状态分为两个子集一个由终态k1={C,D,E,F}组成,一个由非终态k2={S,A,B}组成,
2.考察{S,A,B}是否可分.
因为A经过a到达C属于k1.而S经过a到达A属于k2.B经过a到达A属于k2,所以K2继续划分为{S,B},{A},
3.考察{S,B}是否可再分:
B经过b到达D属于k1.S经过b到达B属于k2,所以S,B可以划分。划分为{S},{B}
4.考察{C,D,E,F}是否可再分:
因为C,D,E,F经过a和b到达的状态都属于{C,D,E,F}=k1所以相同,所以不可再分:
5.{C,D,E,F}以{D}来代替则,因为CDEF相同,你也可以用C来代替。无所谓的最小化的DFA如图,:
“后面这些内容鄙人以为书上都有,列出来整理一下思路、多加练习即可,不必浪费时间敲到电脑上”
- 正则表达式——》正则文法
- 令开始符号为S,S属于非终结符集,VT等于字符集
- 先生成正规产生式S->r
- 再分解正规产生式S->r,分解规则如下:
(R.1)对形如A->r1r2的正规产生式分解为
·
A->r1B,B->r2,B属于非终结符
(R.2)对形如A->r1*r2的正规产生式分解为
- 正则文法——》正则表达式
- 有限自动机——》正则表达式
- 正则表达式——》有限自动机
自动构造词法分析器的步骤——正规式转换为最小化DFA的更多相关文章
- 正规式->最小化DFA说明
整体的步骤是三步: 一,先把正规式转换为NFA(非确定有穷自动机), 二,在把NFA通过"子集构造法"转化为DFA, 三,在把DFA通过"分割法"进行最小化 ...
- 《编译原理》构造与正规式 (0|1)*01 等价的 DFA - 例题解析
<编译原理>构造与正规式 (0|1)*01 等价的 DFA - 例题解析 解题步骤: NFA 状态转换图 子集法 DFA 的状态转换矩阵 DFA 的状态转图 解: 已给正规式:(0|1)* ...
- 报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"
报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState". 出错语句停留 ...
- 正规式α向有限自动机M的转换
[注:这一节是在学习东南大学廖力老师的公开课时,所记录的一些知识点截屏,谢谢廖力老师的辛劳付出] 引入3条正规式分裂规则来分裂α,所得到的是NFA M(因为包含ε弧,之后进行确定化就是所需要求得DF ...
- 有穷自动机(NFA、DFA)&正规文法&正规式之间的相互转化构造方法
在编译原理(第三版清华大学出版社出版)中第三章的词法分析中,3.4.3.5.3.6小节中分别讲解了 1.什么是NFA(不确定的有穷自动机)和DFA(确定的有穷自动机) 2.如何将 不确定的有穷自动机 ...
- 正规式与正规集,DFA与NFA
词法分析器的设计 词法分析器的功能:输入源程序.输出单词符号 词法分析器的设计:给出程序设计语言的单词规范--单词表, 对照单词表设计识别该语言所有单词的状态转换图, 根据状态转换图编写词法分析程序 ...
- using 语句中使用的类型必须可隐式转换为“System.IDisposable
在使用 EF 出现 using 语句中使用的类型必须可隐式转换为“System.IDisposable 今天写在这里分享给大家 出现这样的问题,是因为没有引用 EntityFramework 这个程 ...
- 编译原理:正规式转变成DFA算法
//将正规式转变成NFApackage hjzgg.formal_ceremony_to_dfa; import java.util.ArrayList; class Edge{ public int ...
- NHibernate无法将类型“System.Collections.Generic.IList<T>”隐式转换为“System.Collections.Generic.IList<IT>
API有一个需要实现的抽象方法: public IList<IPermission> GetPermissions(); 需要注意的是IList<IPermission>这个泛 ...
随机推荐
- 安装eclipse插件,很慢终于找到了解决的方法
1 .除非你需要,否则不要选择"联接到所有更新站点" 在安装对话框里有一个小复选框,其标示为"在安装过程中联接到所有更新站点从而找到所需的软件."从表面上看,这 ...
- ubuntu忘记root密码的解决办法
ubuntu忘记密码,不需要重装系统即可重新设置root密码,以下是步骤: 1)在系统一启动时,按ESC键,目的是为了出现选单页面 2) 当看到选单页面时,此时按下[e] 这个键,此时会进入grub ...
- openstack setup demo Compute service
本文包含以下部分 Compute service overview Install and configure controller node Prerequisites Install and co ...
- pycharm内存不足时如何修改设置?
Help->Find Action->(type "VM Options")->(Click)"Edit Custom VM Options" ...
- pkill有的时候并不能杀死进程?
pkill的用法:http://man.linuxde.net/pkill 根据进程命令行,杀死进程 如下intellij.go代码为一个代理服务器,把本地请求转向一个代理 package main ...
- centos7更新、更新、每天更新、每天自动更新
每一天我们的系统时时刻刻都被凶狠之徒盯着,保持软件在最新的状态是其中一项我们必须做,也很容易做到的工作. 首先我们立即手动更新所有预先安装的软件: yum -y update 跟着设定系统定时自动更新 ...
- Cardboard虚拟现实开发初步(二)
Google Cardboard 虚拟现实眼镜开发初步(二) Cardboard SDK for Unity的使用 上一篇文章作为系列的开篇,主要是讲了一些虚拟现实的技术和原理,本篇就会带领大家去看一 ...
- 笔记本电脑 联想 Thinkpad E420 无法打开摄像头怎么办
1 计算机管理-右击USB视频设备(应该显示为黄色问号,表示驱动安装不成功),点击浏览计算机以查找驱动程序软件 2 选择"从计算机的设备驱动程序列表中选择",然后选择Microso ...
- Swift—使用try?和try!区别-仅供参考
在使用try进行错误处理的时候,经常会看到try后面跟有问号(?)或感叹号(!),他们有什么区别呢? 1.使用try? try?会将错误转换为可选值,当调用try?+函数或方法语句时候,如果函数或方 ...
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
C#编译器优化那点事 使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...