编译原理 第三章 自动机基础
Q : 如何记忆本章目录 ?
首先研究正规语言 , 即上文中的正规文法产生的语言
然后研究有限自动机 , 先是基础的定义和分类 , 然后是等价变换
接着考虑正规语言和自动机的转换 , 即上边两部分的联合
最后是DA的实现问题
3.1 正规语言及其描述方法
Q : 什么是正规文法 ?
左线性文法或者右线性文法
Q : 如何表示正规文法 ?
可以用正规文法 , 用正规式 , 有限自动机 , 三者等价
3.1.1 正规语言的正规式表示法
Q : 什么是正规式表达 ?
即 \(ab^+(c + d)\)
3.1.2 正规语言的有限自动机表示法
此处即用FA有限自动机描述正规文法 , 略
需要注意开始位置用\(+\)表示 , 结束位置可以有多个 , 用\(-\)表示
3.2 有限自动机的定义和分类
3.2.1 有限自动机的定义
Q : 有限自动机如何表示 ?
用五元组 \(FA = (Q,\sum , S ,F , delt)\)
含义略
3.2.2 有限自动机怎样描述语言
略
3.2.3 有限自动机的两种表现形式
一种为状态图 , 另一种为变换表
变换表更容易被计算机存储
行列为状态编号和读入字符
表格中值为跳转到的位置
Q : 构造FA表示 \(A = {ab^nc , {(ab)}^n | n \ge 0}\)
我们可以用联合式 , 构建两个独立的自动机 , 缺点是有多个初始状态 ;
也可以用组合式 , 构建带空转移的自动机 , 缺点是带空转移且变换函数多值 ;
最优方法是采用\(DFA\) , 确定有限自动机
3.2.4 有限自动机的分类
DFA , NFA , 带空转移的NFA
3.3 有限自动机的等价变换
我们追求确定化与化简
即追求DFA 和尽可能少的状态数
3.3.1 有限自动机的确定性
Q : 如何将带空转移的NFA转换为DFA ?
- 转换为不带空转移的NFA
- 转换为DFA
Q : 如何转换为不带空转移的NFA ?
-
合并带\(\varepsilon\)边连接的闭环的点集
-
标记隐含的开始态和结束态
-
对剩余的\(\varepsilon\)边重复操作直到无\(\varepsilon\)边
即 :
- 删除一个\(\varepsilon\)边 , 同时
- 引入新边 : 以删除边的终点为起点的边 , 将起点设为删除边起点 , 然后再构建边
Q : 如何转换为DFA呢 ?
-
构建DFA变换表 , 将初始状态(所有初态和初态能到达的节点)标记上
-
迭代表中内容 , 当遇到新状态集时将其添加到变换表中 , 直至没有新元素加入
-
设置终止状态为包含终止状态的集合
3.3.2 有限自动机的最小化
又称为DFA的化简 , 即对给定的DFA , 化简使其状态最少
Q : 如何化简 ?
- 删除无用状态
两部分 , 删除不可达状态和不终极状态
前者从起点开始深搜
后者倒着进行搜索 , 搜不到的就是
- 合并等价状态
Q : 如何判断两个状态是否等价 ?
- 必须全都是结束态或者同不是结束态 ;
- 对所有字母表上的符号 , i , j 变换到等价状态 ;
3.4 正规语言描述方法间的相互转换
Q : 正规语言有哪些描述方法 ?
正规文法 , 正规表达式 , 有限自动机
三者等价 , 任意一个都能转换为其他两个
Q : 这种转换如何实现 ?
略
3.5 有限状态自动机的实现问题
Q : 实际应用过程中 , 如何设计一个自动机 ?
-
假设自动机只作为识别器 , 输出\(yes\) 或者\(no\)
-
扩展自动机 , 设置终止识别的\(no\)符
3.5.1 控制程序设计
略 , 但基本流程为 :
读入符号
判断状态 + 符号是否出现
若出现字典符 , 则改变状态 继续流程 ;
若出现终止符 , 则识别成功 ;
若出现非法符号 , 则识别失败
3.5.2 变换表存储结构设计
Q : 如何选择自动机的数据结构 ?
核心在于存储自动机的状态转移函数
可以考虑二维数组或状态压缩变换表
前者太占空间不予考虑
后者类似开一个vector

浙公网安备 33010602011771号