词法分析概述


有限自动机(FA)

有限自动机是对状态图的形式化描述
也就是说,有限自动机可以等价地表示为状态图,一个状态图也可以表示成等价的FA

有限自动机(Finite Automata)即FA
有限自动机分为:
  确定有限自动机(Deterministic Finite Automata)
  非确定有限自动机(Nondeterministic Finite Automata)


确定有限自动机(DFA)

确定有限自动机 M 是一个五元式 M =(S,Σ,f,S0,F),其中:

  S:有穷状态集
  Σ:输入字母表(有穷)
  f :状态转换函数,即状态转换图中的弧,S×Σ→S的单值部分映射
    f(s,a)=s’,s是现态,输入字符a后,到达s’态
    "单值"是说确定的s,a对应唯一的s’
    "部分"是说,有些状态(终态)可能与任何字符均不存在映射
  S0唯一的初态
  F:终态集(可空)

看下面一个例子:
DFA M =({0,1,2,3},{a,b},f,0,{3}),其中f为
f(0,a)=1 f(0,b)=2
f(1,a)=3 f(1,b)=2
f(2,a)=1 f(2,b)=3
f(3,a)=3 f(3,b)=3

f 画成状态转换矩阵就是酱紫

a b
0 1 2
1 3 2
2 1 3
3 3 3

有没有一点熟悉?
没错,就是表驱动法实现状态转换图时的状态表


DFA与状态转换图

将 M 用状态转换图表示
画出所有状态:

将 f 表示为弧

okk,DFA M 就这样等价地表示为状态图了

注意:
  由DFA的定义,DFA的状态图有且仅有一个初态,
  同一个状态发出的弧上的字符不重复(单值映射,这也是DFA中D含义)

对于Σ*上的任何字α,若存在一条由初态到某一终态的道路,且这条通路上所有弧上的字符连接成的字为α,则称字α为DFA M 所接受/识别

DFA M 所识别的字的全体记为L(M)


DFA的实现

呐,实现一个DFA即是实现与其等价的状态图
状态图的实现参见 词法分析(一):状态转换图


非确定有限自动机(NFA)

NFA的理论研究诞生了一个图灵奖
非确定有限自动机 M 是一个五元式 M = (S,Σ,f,S0,F),其中:

  S:有穷状态集
  Σ:输入字母表(有穷)
  f :状态转换函数,即状态转换图中的弧,S×Σ*→2S的部分映射,
   (2S即S的幂集,是由S的所有子集组成的集合,2S = { A|A⊆S })
    f(s,a)=S’,s是现态,输入字符a后,可到达状态集S’里的任何一个状态,S’ ⊆ 2S
    不保证是单值映射,因此是NFA(NFA的N)
    另外需要注意的是,弧接受的可以是字,甚至是甚至
  S0:非空的初态集
  F:终态集(可空)

对于Σ*上的任何字α,若存在一条由初态到某一终态的道路,且这条通路上所有弧上的字符/字连接成的字为α,则称字α为NFA M 所接受/识别

NFA M 所识别的字的全体记为L(M)


NFA与DFA

NFA相对于DFA的不同

  • NFA可以有多个初态
  • 弧上的标记可以是Σ*上的字,甚至可以是正规式,而不一定是单个字符
  • 同一状态上射出的弧上的字可以重复,也就是说接受同一个字,可以到达多个状态

从定义上可以看出,DFA是NFA的特例

将NFA表示为状态转换图与DFA相似


DFA与NFA的关系

有限自动机的等价:对于任意两个有限自动机 M 和 M1,若L(M)=L(M1),则称M与M1等价
上图中的 L(M)=L(M1) = { 含有aa或bb的字 }
DFA M 与 NFA M1等价

自动机理论中的一个重要结论:判定两个自动机的等价性的算法是存在的
(这里空白太小,写不下,略 )

既然DFA是NFA的特例,凡是DFA可以识别的字集,都可以通过NFA识别,
那么NFA的描述能力是不是比DFA强呢?
即 是否存在某些字的集合,只能用NFA描述,而无法通过DFA描述?
答案是否定的

自动机理论指出:DFA与NFA在识别能力上是相同的
对于每一个NFA M,存在一个DFA M’,使得L(M)=L(M’)

由于NFA与DFA的不同,DFA易于程序实现,NFA易于词法规则的人工设计
那么在设计编程语言时,就需要将NFA转化为等价的DFA
对于每一个NFA M,存在一个DFA M’,使得L(M)=L(M’)
也就是说 任何一个NFA都可以转换为等价的DFA
下面给出NFA转化为等价的DFA的方法,同时也是对于上面这条定理的构造性证明


首先看NFA与DFA的区别

FA\区别 初态 映射 弧接受的内容
DFA 唯一 单值映射 字符
NFA 初态集(可以不唯一) 映射结果也是状态集 字(字符)、正规式

只要等价地消除这三个差别,NFA就转化为了DFA

接下来以下面这个识别含有aa或bb的字的NFA为例,给出构造等价的DFA的过程
有NFA M = (S,Σ,f,S0,F),其状态转换图如下

将此状态转换图做如下改造:

  1. 引进新的初态结点X和终态结点Y,X、Y∉S,用ε弧连接新的初态X与S0中的每一个状态
    并用ε弧连接F中的每个状态和新的终态Y

由于增加的所有弧都是ε弧,所以改造后的状态图识别的字集没有改变,这种变换是等价变换

此时的M具有了唯一的初态

那为什么也要增加唯一的终态呢?
(词法分析中,FA用于判断单词符号是否属于某个正规集(比如某个语言的所有单词集合),以正规式的角度来看,终态应该只有一个,到达终态说明被正规式识别,属于该正规集,未达到终态说明不被正规式所接受 )

接下来将弧上的字/正规式替换为字符

  1. 若状态 i 到状态 j 弧上的字α由字符α1α2组成,在两状态间引入新的状态 k,
    将α分为α1与α2两段弧

如下图所示

使用按照将字拆解为字符的变换方法,可以得到下面的结果

最后只需将NFA确定化,即将NFA中的 f 转化为DFA中的 S×Σ→S的单值映射,
包括化为单值映射、去除ε弧(Σ)
好了,正餐终于到了,下个小节来讲NFA的确定化


NFA的确定化

该方法称为子集法:
  按字符将起始状态集与到达状态集抽象为状态,从而等价地化为单值映射,
  ε弧按照语义被吸收,由 ε-closure 运算去除

首先定义 ε-closure 运算:
  设 I 是状态集的一个子集,则 I 的 ε-闭包 ε-closure(I) 为
   若状态s∈I,则s∈ε-closure(I)
   若状态s∈I,则从s出发经过任意条 ε弧可以到达的任何状态s’,都属于ε-closure(I)

再定义Ia运算:
  设a为Σ中的一个字符,定义Ia=ε-closure(J),其中,
    J为I中的某个状态出发经过一条a弧而到达的状态集合,Ia即是为这样的集合作ε-闭包

以下图的NFA为例,说明ε-闭包及Ia运算

ε-closure({1}) = {1,2}
记 I = {1,2},则 Ia= ε-closure({5,4,3}) = {5,4,3,6,2,7,8}

在下图NFA中使用子集法进行确定化

如下表,表头为参与计算的状态集 I,各字符的运算结果 Ii,其中i∈Σ
每个计算出的状态集再进行 Ii 的运算、
因为Σ为有限集,所以这张表也是有限的

I Ia Ib
ε-closure({X}) {1,5,2} {1,6,2}
{1,5,2} {1,3,5,2,4,Y} {1,6,2}
{1,6,2} {1,5,2} {1,3,6,2,4,Y}
{1,3,5,2,4,Y} {1,3,5,2,4,Y} {1,6,4,2,Y}
{1,3,6,2,4,Y} {1,5,4,2,Y} {1,3,6,4,2,Y}
{1,6,4,2,Y} {1,4,5,2,Y} {1,3,4,6,2,Y}
{1,5,4,2,Y} {1,3,4,5,2,Y} {1,4,6,2,Y}

这张表实际上就是状态集 I 接收字符 i 后到达状态集 Ii,描述了状态集间的单值映射

将每个状态集视为新的状态,该表即为一个状态转换矩阵
这个状态转换矩阵就是一个新的FA,而且是一个DFA
其中含有原先初态X的状态集为新的初态,含有原来任何一个终态的状态集都是新的终态

a b
0 1 2
1 3 2
2 1 4
3 3 5
4 6 4
5 6 4
6 3 5

这个表是不是也很熟悉?
斯巴拉西!DFA有辽!
画成状态图!

不难看出,这就是识别含有aa或bb的字的DFA

那么,现在的词法分析的理论已经是下面酱紫了

小结:程序设计语言的单词集合是一个正规集,可以由正规式描述,正规式与正规集是一组对应的概念;FA分为DFA和NFA,NFA易于人工设计,DFA易于词法分析的程序实现,从定义上来看,DFA是NFA的特例,而NFA与DFA的描述是相同的,并且NFA可以等价地转换为DFA


其实有一个问题
左边是子集法由NFA确定化得到的DFA,右边是我们之前见过的DFA

大家都是识别含有aa或bb的串的DFA,为啥子集法构造出来的就复杂些呢?

这里又有了新的姿势,DFA的化简,或者说最小化

这篇的内容有点多了,下一篇
词法分析(四):DFA的化简


2019/7/23

词法分析(三):有限自动机DFA与NFA相关推荐

  1. 确定与不确定有限自动机DFA与NFA及子集法互相转换

    编译原理正规式NFA与DFA及子集法 1.基础术语与概念: 语法描述基本概念 字母表:一个有穷字符集记为Σ 字母表中每个元素称为字符 Σ上的字(字符串)是指Σ中的字符所构成的一个有穷序列 不包含任何字 ...

  2. 【编译原理系列】词法分析与有限自动机

    词法分析 编译器中唯一与源程序打交道的部分:规定所有合法输入+识别合法输入 任务: 滤掉源程序中的无用成分,如注释.空格.回车等 处理与具体平台有关的输入,如文件结束符的不同表示等 根据模式识别记号, ...

  3. 【计算理论】计算理论总结 ( 非确定性有限自动机 NFA 转为确定性有限自动机 DFA | 示例 ) ★★

    文章目录 一.NFA 转 DFA 示例 1 二.NFA 转 DFA 示例 2 三.NFA 转 DFA 示例 3 一.NFA 转 DFA 示例 1 将下图的 非确定性有限自动机 NFA 转为确定性有限自 ...

  4. 【编译原理笔记03】词法分析:正则表达式、有穷自动机(FA)、DFA与NFA及RE的相互转换、DFA识别单词、语法检测

    本次笔记内容: 3-1 正则表达式 3-2 正则定义 3-3 有穷自动机 3-4 有穷自动机的分类 3-5 从正则表达式到有穷自动机 3-6 从NFA到DFA的转换 3-7 识别单词的DFA 文章目录 ...

  5. 确定有限自动机(DFA)和不确定有限自动机(NFA)的主要区别

    区别点 DFA NFA 转移 对输入的转移是确定的,每个状态对每个输入只有一条路径 对输入的转移是不确定的,每个状态对每个输入可以有多条路径 转移函数 所有转移函数都是部分函数,每个状态都有明确定义的 ...

  6. 编译原理——词法分析(3)有穷自动机中DFA与NFA的理解

    1.1词法分析器生成工具Lex 虽然在学习上,我们学习的是Lex,但是最近经常使用的是词法分析器生成工具是Flex,它可以为C语言生成代码,Vern Paxson于1987年以C语言写作了Flex,他 ...

  7. DFA与NFA的比较

    正则表达式的规则很容易理解,但是正则表达式并不能直接用来解析字符串,我们还要引入一种适合转化为计算机程序的模型.今天我们引入的这种模型就叫做有穷自动机(finite automation,FA),有时 ...

  8. 正规式到nfa dfa java_正规式与正规集,DFA与NFA

    词法分析器的设计 词法分析器的功能:输入源程序.输出单词符号 词法分析器的设计:给出程序设计语言的单词规范--单词表, 对照单词表设计识别该语言所有单词的状态转换图, 根据状态转换图编写词法分析程序 ...

  9. DFA和NFA的区别

    正则表达式引擎分成两类,一类称为DFA(确定性有穷自动机),另一类称为NFA(非确定性有穷自动机).两类引擎要顺利工作,都必须有一个正则式和一个文本串,一个捏在手里,一个吃下去.DFA捏着文本串去比较 ...

  10. 形式语言和自动机总结DFA、NFA

    第一章DFA 形式定义和状态转移函数: DFA是一种特殊的NFA, A={Q,,,,F} Q:输入状态集,∑:字母表,δ:状态转移函数Q×∑→Q q0∈Q初始状态 F终结集 设计举例 1.设计接受偶数 ...

最新文章

  1. envi 文件 生成mat_JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
  2. 官方文档翻译-ESP32-High Resolution Timer
  3. node-sass 下载失败 解决方案
  4. CCNA学习心得(一)
  5. securecrt哪个版本好用_电脑跑分测试软件哪个好?好用的电脑跑分软件推荐
  6. Linux下matlab中文乱码,linux下安装的matlab无法显示中文,怎么办?求详细解答!谢谢!...
  7. 字符设备驱动程序的使用
  8. 算法与数据结构之判断是否为n的幂
  9. 用自己的数据集训练Mask-RCNN实现过程中的坑
  10. Foxmail设置方法
  11. 用Python网络爬虫来看看最近电影院都有哪些上映的电影
  12. < 渗透测试学习指南 > python编写ARP投毒工具
  13. Win10杀毒软件大PK:Defender垫底 卡巴/小红伞第一
  14. MATLAB生成exe脱离matlab运行可执行程序
  15. linux环境下python机器学习环境的搭建
  16. 路由之间的转跳及传参
  17. itext 5 根据模板生成PDF util类
  18. 14岁妹妹欲捐骨髓救乱患红血病哥哥
  19. npm run serve起项目报错node-sass not find
  20. 周一指导7.11黄金白银TD实时行情预测及原油解套操作建议

热门文章

  1. 万网域名转向指定URL地址
  2. android webview 设置下载文件,如何使用Android webview下载文本文件
  3. seo与sem的区别在哪里
  4. 科学计算机计算等比求和公式,等比数列求和公式
  5. isupper函数用法
  6. 儿童专注力训练——虚线描成实现
  7. 数据分析:单元3 图像的手绘效果实现
  8. 这5种数据挖掘技术,大数据玩的贼溜!
  9. 秒杀各大网盘的不限速大文件传输工具
  10. phpstudy下载、安装、配置、网站部署、卸载