编译原理 第三章 自动机基础

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 ?

  1. 转换为不带空转移的NFA
  2. 转换为DFA

Q : 如何转换为不带空转移的NFA ?

  1. 合并带\(\varepsilon\)边连接的闭环的点集

  2. 标记隐含的开始态和结束态

  3. 对剩余的\(\varepsilon\)边重复操作直到无\(\varepsilon\)
    即 :

  • 删除一个\(\varepsilon\)边 , 同时
  • 引入新边 : 以删除边的终点为起点的边 , 将起点设为删除边起点 , 然后再构建边

Q : 如何转换为DFA呢 ?

  1. 构建DFA变换表 , 将初始状态(所有初态和初态能到达的节点)标记上

  2. 迭代表中内容 , 当遇到新状态集时将其添加到变换表中 , 直至没有新元素加入

  3. 设置终止状态为包含终止状态的集合

3.3.2 有限自动机的最小化

又称为DFA的化简 , 即对给定的DFA , 化简使其状态最少

Q : 如何化简 ?

  1. 删除无用状态
    两部分 , 删除不可达状态和不终极状态

前者从起点开始深搜

后者倒着进行搜索 , 搜不到的就是

  1. 合并等价状态

Q : 如何判断两个状态是否等价 ?

  1. 必须全都是结束态或者同不是结束态 ;
  2. 对所有字母表上的符号 , i , j 变换到等价状态 ;

3.4 正规语言描述方法间的相互转换

Q : 正规语言有哪些描述方法 ?

正规文法 , 正规表达式 , 有限自动机
三者等价 , 任意一个都能转换为其他两个

Q : 这种转换如何实现 ?

3.5 有限状态自动机的实现问题

Q : 实际应用过程中 , 如何设计一个自动机 ?

  1. 假设自动机只作为识别器 , 输出\(yes\) 或者\(no\)

  2. 扩展自动机 , 设置终止识别的\(no\)

3.5.1 控制程序设计

略 , 但基本流程为 :

读入符号

判断状态 + 符号是否出现

若出现字典符 , 则改变状态 继续流程 ;

若出现终止符 , 则识别成功 ;

若出现非法符号 , 则识别失败

3.5.2 变换表存储结构设计

Q : 如何选择自动机的数据结构 ?

核心在于存储自动机的状态转移函数
可以考虑二维数组状态压缩变换表
前者太占空间不予考虑

后者类似开一个vector v[N]来存树的感觉 , 自动机的每个状态都转换为一个链表 , 存储可以抵达的地方

posted @ 2025-04-26 13:12  Guaninf  阅读(89)  评论(0)    收藏  举报