编译原理预习笔记(一)

NFA的确定化

1. DFA、NFA的概念

有穷状态自动机根据确定性可以分为“确定有穷状态自动机”(DFA - Deterministic finite automaton)和“非确定有穷自动机”(NFA - Non-deterministic finite automaton)

  • DFA,确定性有穷状态自动机:在输入一个状态时,只得到一个固定的状态
  • NFA:“非确定有穷自动机”(NFA - Non-deterministic finite automaton),当输入一个字符或者条件得到一个状态机的集合

2. 为什么要将NFA确定化

DFA的确定性表现在转换函数f:SX2- >S是-一个单值函数,也就是说对任何状态k∈S,和输入符号a∈2,f(k,a)唯一 地确定了 下一个状态。

3. NFA与DFA的区别

DFA对于文本串里的每一个字符只需扫描一次,比较快,但特性较少;匹配速度与,确定
NFA要翻来覆去吃字符、吐字符,速度慢,但是特性丰富;匹配结果,不确定

区别:
  1. DFA比较快,但不提供Backtrack(回溯)功能,NFA比较慢,但提供了Backtrack功能。
  2. NFA是基于表达式的(Regex-Directed),而DFA是基于文本的(Text-Directed)。
  3. DFA引擎在任意时刻必定处于某个确定的状态,而NFA引擎可能处于一组状态之中的任何一个,所以,NFA引擎必须记录所有的可能路径(trace multiple possible routes through the NFA),NFA之所以能够提供Backtrack的功能,原因就在这里。

4. 什么是子集映射法

将NFA的一个状态子集在DFA中用一个状态表示出来。
在这里插入图片描述
从NFA的矩阵表示中可以看出,表项通常是一一个状态的集合,而在DFA的矩阵表示中,表项是一个状态。
NFA到相应的DFA的构造的基本想法是让DFA的每个状态代表NFA的一个状态集合。
即在转换后的DFA中,使用它的状态去记录在NFA中读入一个输入符号后可能到达的所有状态。
换句话说,在得到的DFA中若输入符号串aa2-a后,到达某个状态,那么该状态表示对应的NFA的状态集的一个子集,这个子集是NFA在输入符号串a1a2–a后可以到达的那些状态组成的集合。

5. 三个重要运算

  1. 状态集E -闭包
  2. 状态集a弧转换
  3. 状态集a弧转换的必报Ia

6. NFA转换为DFA的具体步骤

  1. 构造的DFA的状态转换矩阵有几列,每列的含义
  2. 矩阵的第一行,第一列元素是什么?其余各行列如何填?
  3. 转换后DFA的初态,终态分别是什么?
  4. 算法是否收敛?为什么?

参考链接
DFA和NFA的区别
https://blog.csdn.net/cpucooler2011/article/details/50347303

DFA极简化和NFA确定化
https://blog.csdn.net/qwezhaohaihong/article/details/80705961

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.1 编译器概述.flv 1.2 编译器结构.flv 1.3 编译器实例.flv 2.1 词法分析的任务.flv 2.2.1 词法分析器的手工构造1.flv 2.2.2 词法分析器的手工构造2.flv 2.2.3 词法分析器的手工构造3.flv 2.3.1 正则表达式1.flv 2.3.2 正则表达式2.flv 2.3.3 正则表达式3.flv 2.3.4 正则表达式4.flv 2.4.1 有限状态自动机1.flv 2.4.2 有限状态自动机2.flv 3.1.1 RE转换成NFA:Thompson算法1.flv 3.1.2 RE转换成NFA:Thompson算法2.flv 3.1.3 RE转换成NFA:Thompson算法3.flv 3.2.1 NFA转换成DFA:子集构造算法1.flv 3.2.2 NFA转换成DFA:子集构造算法2.flv 3.2.3 NFA转换成DFA:子集构造算法3.flv 3.2.4 NFA转换成DFA:子集构造算法4.flv 3.3.1 DFA的最小化:Hopcroft算法1.flv 3.3.2 DFA的最小化:Hopcroft算法2.flv 3.3.3 DFA的最小化:Hopcroft算法3.flv 3.4.1 从DFA生成分析算法1.flv 3.4.2 从DFA生成分析算法2.flv 3.4.3 从DFA生成分析算法3.flv 4.1.1 语法分析的任务1.flv 4.1.2 语法分析的任务2.flv 4.1.3 语法分析的任务3.flv 4.2.1 上下文无关文法和推导1.flv 4.2.2 上下文无关文法和推导2.flv 4.2.3 上下文无关文法和推导3.flv 4.2.4 上下文无关文法和推导4.flv 4.2.5 上下文无关文法和推导5.flv 4.3.1 分析树和二义性文法1.flv 4.3.2 分析树和二义性文法2.flv 4.3.3 分析树和二义性文法3.flv 4.3.4 分析树和二义性文法4.flv 4.4.1 自顶向下分析1.flv 4.4.2 自顶向下分析2.flv 4.4.3 自顶向下分析3.flv 4.4.4 自顶向下分析4.flv 4.5.1 递归下降分析算法1.flv 4.5.2 递归下降分析算法2.flv 4.5.3 递归下降分析算法3.flv 4.5.4 递归下降分析算法4.flv 5.1.1 LL(1)分析算法1.flv 5.1.2 LL(1)分析算法2.flv 5.1.3 LL(1)分析算法3.flv 5.1.4 LL(1)分析算法4.flv 5.1.5 LL(1)分析算法5.flv 5.1.6 LL(1)分析算法6.flv 5.1.7 LL(1)分析算法7.flv 5.1.8 LL(1)分析算法8.flv 5.2 LL(1)分析的冲突处理.flv 5.3.1 LR(0)分析算法1.flv 5.3.2 LR(0)分析算法2.flv 5.3.3 LR(0)分析算法3.flv 5.3.4 LR(0)分析算法4.flv 5.4 SLR分析算法.flv 5.5 LR(1)分析算法.flv 5.6.1 LR(1)分析工具1.flv 5.6.2 LR(1)分析工具2.flv 5.6.3 LR(1)分析工具3.flv 6.1.1 语法制导翻译1.flv 6.1.2 语法制导翻译2.flv 6.1.3 语法制导翻译3.flv 6.2.1 语法制导翻译的实现原理1.flv 6.2.2 语法制导翻译的实现原理2.flv 6.3.1 抽象语法树1.flv 6.3.2 抽象语法树2.flv 6.3.3 抽象语法树3.flv 6.3.4 抽象语法树4.flv 6.4.1 抽象语法树的自动生成1.flv 6.4.2 抽象语法树的自动生成2.flv 7.1.1 语义分析的任务1.flv 7.1.2 语义分析的任务2.flv 7.1.3 语义分析的任务3.flv 7.2.1 语义规则及实现1.flv 7.2.2 语义规则及实现2.flv 7.2.3 语义规则及实现3.flv 7.2.4 语义规则及实现4.flv 7.3.1 符号表1.flv 7.3.2 符号表2.flv 7.3.3 符号表3.flv 7.4 语义分析中的其它问题.flv
1. 实验内容 每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA 化简为与之等价的最简DFA。 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。 (2)对I采用下面所述的过程来构造新的划分I-new. For I 中每个组G do Begin 当且仅当对任意输入符号a,状态s和读入a后转换到I的同一组中; /*最坏情况下,一个状态就可能成为一个组*/ 用所有新形成的小组集代替I-new中的G; end (3)如果I-new=I,令I-final=I,再执行第(4)步,否则令I=I=new,重复步骤(2)。 (4)在划分I-final的每个状态组中选一个状态作为该组的代表。这些代表构成了化简后的DFA M'状态。令s是一个代表状态,而且假设:在DFA M中,输入为a时有从s到t转换。令t所在组的代表是r,那么在M’中有一个从s到r的转换,标记为a。令包含s0的状态组的代表是M’的开始状态,并令M’的接受状态是那些属于F的状态所在组的代表。注意,I-final的每个组或者仅含F中的状态,或者不含F中的状态。 (5)如果M’含有死状态(即一个对所有输入符号都有刀自身的转换的非接受状态d),则从M’中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值