前言

编译原理真的是天书,老师课上讲的我是完全不懂的,以下仅仅是个人通过搜集资料和做题得出来的解题方法,可能只能拿来应付做题考试,并非专业理论的东西,我将用尽可能简单易懂的办法来叙述。

方法

Step1 由正则式构造出NFA

基本规则如下

我们根据要读入的符号来画这个图,比如读入一个a,那么从前一个状态到后一个状态中间就是一个指向箭头上面写个a,特殊的,例如有 | 或 * 号的,就遵守上图的方法来画,最后就能得到NFA的图。

例如

正则表达式 (ab)*(a*|b*)(ba)* 的NFA转换过程如下:

总的来讲这一步就是按顺序读串(注意括号的先后级),直到形成最后的NFA图。

我们再拿一个正则式举例,接下来的步骤将按照这个正则式完成。

例如正则式 1(0|1) *101 可得到NFA图如下:

Step2 根据NFA图得到“状态转换表”(子集构造法)

完成了第一步的图以后,我们根据图来完成状态转换表。

首先看你的NFA图上有几种符号(不包括空字符串ε)。

例如上图中只有0和1两种符号,那么我们接下来要画的表就一共有2+1(总的状态列)=3列

其中第一列我将其成为总的状态列,第二列即第一列中的每个状态将1拿进去走,能得到的状态的集合,第三列同理,即第一列中的每个状态将0拿进去走,能得到的状态的集合。

I I1 I0
     

然后我们来看NFA图,代入不同符号(要注意只要包括这个符号,前后可以有任意个ε),找到他们能走到的状态的集合。

首先我们以S开始,经过任意个ε得到的结点就是第一个I,这道题就是{S}(因为我们发现图中S只能给个1才能到A,给其他任何符号都走不下去),故我们在表格中第一行第一列填入{S}

I I1 I0
{S}    

然后将1拿进去让他去一步步走,能得到状态A(如下图),那么此时集合I1就是{A}

但是别着急,我们继续往后看,A如果读进空字符串ε还能到B,再读一个ε还能到C,而且B读一个1以后还能到B自身

          

那么此时集合就是{A,B,C},我们将其填入第一行的第二列

I I1 I0
{S} {A,B,C}  

I0同理,我们发现S代入0让他走,没办法到任何节点,故我们填入空集∅

I I1 I0
{S} {A,B,C}

第一行至此完成。

接着我们看表格中还有没有没处理过的集合(即表格中还存在没有在第一列中的集合)

我们发现{A,B,C}还不存在于第一列中,我们将其填入

I I1 I0
{S} {A,B,C}
{A,B,C}    

然后同理,按照上述办法,我们让A,B,C状态分别读入1,

A读入1后,可以到B(读一个ε,再读一个1),可以到C(读一个ε,再读一个1,再读一个ε),可以到D(读一个ε,再读一个1,再读一个ε,再读一个1)

B读入1后,可以到B,可以到C(读一个1,再读一个ε),可以到D(读一个1,再读一个ε,再读一个1)

C读入1后,可以到D

所以可得到的集合是{B,C,D},将其填入第二行第二列

I I1 I0
{S} {A,B,C}
{A,B,C} {B,C,D}  

然后我们再让A,B,C状态分别读入0,

A读入0后,可以到B(读一个ε,再读一个0),可以到C(读一个ε,再读一个0,再读一个ε)

B读入0后,可以到B,可以到C(读一个0,再读一个ε)

C读入0后,到不了任何状态

所以可得到的集合是{B,C},将其填入第二行第三列

I I1 I0
{S} {A,B,C}
{A,B,C} {B,C,D} {B,C}

重复上面的工作,我们发现集合{B,C,D}和集合{B,C}在第一列中还不存在,故拿过去,再算!

I I1 I0
{S} {A,B,C}
{A,B,C} {B,C,D} {B,C}
{B,C,D}    
{B,C}    

中间的过程都是一样的,就不再重复了,最后我们得到的表格是这样的:

I I1 I0
{S} {A,B,C}
{A,B,C} {B,C,D} {B,C}
{B,C,D} {B,C,D} {B,C,E}
{B,C} {B,C,D} {B,C}
{B,C,E} {B,C,D,Z} {B,C}
{B,C,D,Z} {B,C,D} {B,C,E}

至此,我们已经完成了表格。

Step3 根据“状态转换表”得到DFA图

我们对上面的表格,第一列中不同的状态集进行状态编号,如下表中红色标识的编号,这就是我们的DFA图中所有的状态,我将末态定为Z,可以是随意的。

I I1 I0
A    {S} {A,B,C}
B    {A,B,C} {B,C,D} {B,C}
C    {B,C,D} {B,C,D} {B,C,E}
D    {B,C} {B,C,D} {B,C}
E    {B,C,E} {B,C,D,Z} {B,C}
Z    {B,C,D,Z} {B,C,D} {B,C,E}

然后,在后面几列中的状态集按照第一列的编号,也写出来,方便后面我们画箭头。

I I1 I0
A    {S} {A,B,C}   B
B    {A,B,C} {B,C,D}   C {B,C}   D
C    {B,C,D} {B,C,D}   C {B,C,E}   E
D    {B,C} {B,C,D}   C {B,C}   D
E    {B,C,E} {B,C,D,Z}   Z {B,C}   D
Z    {B,C,D,Z} {B,C,D}   C {B,C,E}   E

全部标完以后,我们找出末态(终态)

很简单,就是包含NFA中末态的状态,这里A,B,C,D,E,Z六种状态中,只有Z:{B,C,D,Z}包含原NFA中的末态Z

接下来我们来画DFA图,先画出所有的状态,定好初态(我这里是A),末态用双圆圈表示

然后看表,例如第一行,我们发现状态A通过1能走到状态B,通过0走不到任何状态,所以我们画一个箭头到B,上面写上1

同理,再看第二行,一直标下去,最后的结果如下:

至此,我们的DFA图就画完了。

Step4 DFA图的最小化

几个概念:
1.多于状态:对于一个状态Si,若从开始状态出发,不可能到达改状态Si,则Si为多余(无用)状态。
2.死状态:对于一个状态Si,对于任意输入符号a,若转到它本身后,不可能从它到达终止状态,则称Si为死状态。
都称为无关状态
3.等价状态:若Si为自动机的一个状态,我们把从Si出发能导出的所有符号串的集合记为L(Si)。
设有两个状态Si和Sj,若有L(Si)=L(Sj),则称Si和Sj是等价状态。
4.可区别状态:自动机中两个状态Si和Sj,如果它们不等价,则称它们可区别。
5.两个状态(Si和Sj)等价的判断条件:
(1)状态Si和Sj必须同时为终止状态或同时为非终止状态。即终止状态和非终止状态是可区别的。
(2)状态Si和Sj对于任意输入符a∈Σ,必须转到等价的状态里,否则Si和Sj是可区别的。

首先要找出初态和末态的集合,很简单,初态为{A,B,C,D,E},末态为{Z}

接下来分别代入符号(本例中是0和1),找出从各个集合中的各个状态从这个符号出发到的状态的集合,再比较是否是上一个π中的子集。

一个化简:观察一下DFA图,我们发现在集合{A,B,C,D,E}中,B,C,D,E代入0和1都是允许的,但A只能代入1,无法代入0,因此我们首先就可以把A单独提出来。

因此变成:

例如本题中,我们将{B,C,D,E}中各个状态先代入0得到的状态集合如下:

针对上述结果集合的说明:

B代入0得到D

C代入0得到E

D代入0得到D

E代入0得到D

故结果集合为{D,E}

我们发现

针对上述式子的说明:

因为π0中包含集合{B,C,D,E},而{D,E}是{B,C,D,E}的一个子集,故得到此结果。

接下来我们将{B,C,D,E}中各个状态先代入1得到的状态集合如下:

我们发现

因此我们需要将集合{B,C,D,E}进一步拆分。

通过上面的计算方法,我们知道了:如果π中的一个集合代入各个状态,只要出现得到的结果集合不是π的子集的情况,就需要进一步拆分。

我们可以简单观察得到{B,C,D}代入0和1以后得到集合都是π0的子集,但E代入1后突然就多出个Z,因此将{B,C,D,E}分为{B,C,D}和{E},得到

重复刚才的操作,有

因此再将{B,C,D}拆分,如何拆分的方法还是跟上面一样的:

再一次检查,这次我们发现

终于,我们得到了最小化的集合π2

这个集合告诉我们,其实B和D状态是等价的,我们可以去掉一个。

例如我们去掉D,那么此时相当于还剩下A,B,C,E,Z五个状态。(其实你也可以重新给状态命名,这里便于理解就不重命名了)

将这五个状态重新画一下DFA图,就是最小化的DFA图了!

这里注意一下,在原来的DFA图中,E走0可以到D,现在我们知道B和D是等价的,故在最小化DFA图中,E走0能到B

同理,原图中D走0可以到他自身,现在由于B和D是等价的,故在最小化DFA图中,B走0能到他自身。

至此,本题已经做完,方法也应该掌握!

完结散花。

后记

技术和知识储备有限,在编写过程中可能会存在错误,如果您发现了错误请您在下方评论中发出,我会及时更正,谢谢!

【编译原理总结】由正则式构造等价的DFA并将其最小化相关推荐

  1. 【编译原理】正则文法与正则式的等价性

    正则文法到正规式的转换规则: 文法表达式 正则式 规则1 A->xB B->y A=xy 规则2 A->xA|y A=x*y 规则3 A->x A->y A=x|y 正则 ...

  2. 编译原理词法分析(正规式转NFA)

    文章目录 [问题描述] [基本要求] [测试用例] [解决步骤] 正规式转NFA方法步骤: 图的构建过程: 完整代码: [问题描述] 正规表达式→NFA问题的一种描述是: 编写一个程序,输入一个正规表 ...

  3. 编译原理_NFA与正规式

    然后,反复使用下面三条规则,逐步消去节点,直到只剩下X和Y为止 证明 对于任何正规式r 都有一个FA M(也就是自动机)与之等价 使用数学归纳法 step1 step2 也就是说r1和r2都成立的情况 ...

  4. 编译原理之:正规式,正规集

    正规式也叫正则表达式,它是一种描述字符串构成模式的方法,就是字符串的有限表示.比如正规式a∧+(a的正闭包),表达a,aa,aaa- 正规集则是对应正规式表达的所有字符串的集合.

  5. 编译原理 —— 正规文法转换为正规式

    正规文法与正规式都是描述正规集的工具.对任意一个正规文法,存在定义统一语言的正规式:反之,对每个正规式存在一个生成同一语言的正规文法. 对任何正规文法G,存在定义同一语言的正规式 r 求解过程 ① 将 ...

  6. 了解编译原理-笔记小结

    这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译 ...

  7. 编译原理课程实践——实现一个初等函数运算语言的解释器或编译器

    编译原理课程实践--实现具有初等函数运算语言的解释器或编译器 作者:Sylvan Ding |转载请注明文章出处! 摘要:本文主要内容是设计词法分析器.语法分析器(LL(1).SLR(1))和语义分析 ...

  8. 朱娜斐编译原理复习笔记-北京工业大学软件学院

    朱娜婓编译原理学习笔记 说明 笔记大部分内容来自参考资料[1], 看了B站上中科大华保健老师的编译原理课视频(参考资料[2]),补充完善了DFA的代码表示.Hopcroft 算法.文法重写.LL(1) ...

  9. 计算机编译原理 张,计算机编译原理概念总结

    <计算机编译原理概念总结>由会员分享,可在线阅读,更多相关<计算机编译原理概念总结(11页珍藏版)>请在人人文库网上搜索. 1.第一章 引论?为什么要用编译器? 与编译器相关的 ...

  10. 编译原理笔记(二)之词法分析

    编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...

最新文章

  1. 【工具软件】webstorm的实用快捷操作(持续积累)
  2. android 获取手机GSM/CDMA信号信息,并获得基站信息
  3. templateref html内容,angular之ng-template模板加载
  4. cocos2d-x坐标系
  5. (chap2 简单的Http协议) HTTP性能优化之持久连接Keep Alive
  6. 使用二进制的方式安装mysql实践纪要
  7. html5做一个展示页面,基于HTML5的WebGL实现json和echarts图表展现在同一个界面
  8. iMeta宏基因组生物信息期刊-创刊背景和简介
  9. Firebug控制台详解(转)
  10. Gulp browserify livereload
  11. KVM基础安装,手动创建桥
  12. Java int数组转List
  13. 多个桌面Deskspace如何使用
  14. Linux通过windows代理上网并安装软件
  15. 如何使用微PE工具箱制作U盘PE
  16. 互联网DSP广告系统架构及关键技术解析 | 广告行业资深架构师亲述
  17. CDH Parcel包starrocks集成cloudera Manager
  18. android生成将布局生成海报保存并分享
  19. Diagnosing Intermittent Authentication Failures and User Lock-Outs in Oracle WebLogic
  20. 丘成桐大学生数学竞赛数学物理

热门文章

  1. java图片自动盖章,一种自动盖章装置的制作方法
  2. error LNK2005: 已经在*.obj中定义
  3. 怎么解决mysql登录闪退问题
  4. 成功解决 3DMAX报错:3D MAX application 已停止工作的解决方法
  5. Allegro设置尺寸单位milmm
  6. 分享15款堪称神器却鲜为人知的软件和网站
  7. iOS版本 不限速迅雷 企业证书打包的 https://www.pgyer.com/yZAv 密码 9800
  8. html5 游戏 圈 猫,HTML5捉猫游戏
  9. 用JAVA语言定义一个标准的学生类
  10. html5的图片上传插件,分享5个好用的javascript文件上传插件