编译原理课程第3讲
编译原理第03章PPT课件
65
-
procedure swap(var x:integer); begin x:=x+a; /*a是全局变量*/
a:=x-a; x:=x-a end; 调用swap(a);别名也影响编译器生成优化的代 a:=(x-y*z)+w ; b:=(x-y*z)+u ; 若a与x、y或z中任一个是别名
用标号控制循环体 DO 7 I=1,10 A(I)=0 B(I)=0
7 CONTINUE
19
-
②Pascal的for 语句
计数重复的值可在任何有序集上 for . . . to . . . for . . . down to . . .
20
-
2. 条件制导
①while:0次或多次重复 ②do-while,repeat-until:多次重复 ③ALGOL 68循环的一般形式:
Smalltalk 语言以对象方式来处理控 制结构。
40
-
可以认为上述语言是可扩充的,用 户可以通过定义新的(抽象)数据类型 和控制结构来扩充基本语言。
但基本的控制结构并没有发生改变。
41
-
第二节 单元级控制结构
规定程序单元之间控制流程的机制。 最简单的机制是 ALGOL60 的分程序
42
-
在程序顺序执行的过程中,遇到一 个分程序,就建立一个新的引用环境, 并执行这个分程序。
7
-
3. 多选一 嵌套 的 if then else
if语句包含if语句 ①ALGOL 60的选择结构引起二义性
if x>0 then if x<6 then x:=0 else x:=9 ②PASCAL的“最近匹配原则” ③ ALGOL 68中if语句的结束符号fi ④ ALGOL 68对else if 进行缩写
编译原理_第3章课件
编译原理_第3章课件第三章词法分析本章将讨论词法分析程序的设计原则,单词的描述技术,识别机制及词法分析程序的⾃动构造原理。
教学要求1.掌握:正规式,DFA的概念,NFA的概念2.理解:将NFA转换为DFA ,正规式、正规⽂法与有穷⾃动机间的转换⽬录3.1 词法分析程序的设计3.2 单词的描述⼯具3.3 有穷⾃动机3.4 正规式与有穷⾃动机的等价性3.5 正规⽂法和有穷⾃动机的等价性3.6 词法分析程序的⾃动构造⼯具⼩结3.1.词法分析(lexical analysis)程序的设计回顾:1、词法分析的任务:逐个读⼊源程序字符并按照构词规则切分成⼀系列单词。
2、词法分析程序:实现词法分析的程序。
⼀.词法与语法分析程序的接⼝⽅式1、作为独⽴的⼀遍词法分析是编译过程中的⼀个阶段,在语法分析前进⾏,把字符流的源程序变为单词序列,输出在⼀个中间⽂件上。
2、与语法分析结合在⼀起作为⼀遍⼀般、把词法分析程序设计成⼀个⼦程序,由语法分析程序调⽤词法分析程序来获得当前单词,供语法分析使⽤。
….词法分析程序的主要任务:读源程序,产⽣单词符号词法分析程序的其他任务:滤掉空格,跳过注释、换⾏符追踪换⾏标志,复制出错源程序,宏展开,……⼆、词法分析程序的输出输出是单词符号。
单词是语⾔中具有独⽴意义的最⼩单位。
单词包括:保留字标识符常量运算符界符(标点符号)词法分析程序所输出的单词符号常常采⽤以下⼆元式表⽰:(单词种别,单词⾃⾝的值)。
单词的种别是语法分析需要的信息,⽽单词⾃⾝的值则是编译其它阶段需要的信息。
(标识符,指向该标识符所在符号表中位置的指针) 单词的种别可以⽤整数编码表⽰,假如标识符编码为1,常数为2,保留字为3,运算符为4,界符为5例如:程序段if i=5 then x∶=y;在经词法分析器扫描后输出的单词符号和它们的表⽰如下:- 保留字if(3,'if')- 标识符i(1,指向i的符号表⼊⼝)- 等号=(4,'=')- 常数5(2,'5')- 保留字then(3,'then')- 标识符x(1,指向x的符号表⼊⼝)- 赋值号∶=(4,'∶=')- 标识符y(1,指向y的符号表⼊⼝)- 分号;(5,';')三、词法分析⼯作从语法分析⼯作独⽴出来的原因:简化设计改进编译效率增加编译系统的可移植性3.2 单词的描述⼯具程序设计语⾔中的单词是基本语法成分.单词符号的语法可以⽤有效的⼯具加以描述,并且基于这类描述⼯具,实现词法分析程序的⾃动构造.描述⼯具:正规⽂法和正规式识别⼯具:有穷⾃动机⼀.正规⽂法多数程序设计语⾔的单词的语法能⽤正规⽂法来描述。
编译原理课堂讲义解析
编译第3次课:内容:1、上下文无关文法与语言的关系(第二章内容)2、词法分析器设计及其与语法分析器的关系(第三章内容)3、状态转换图与词法分析器实现(第三章内容,看同学前面知识的接受程度与进度再决定该部分内容是否本节课上讲)重点:1、上下文无关文法与语言的关系2、语法树与二义性3、状态转换图过程:1、开场,本节知识在编译中的作用2、中间与学生交互(语言中句子的个数?如何达到无穷个的?语法的二义及其原因?)3、总结:1)指出本节的重点1、上下文无关文法与语言的关系;2、语法树与二义性;3、状态转换图;2)下节内容简介编译第4次课:内容:1、词法分析器设计的相关问题(第三章)2、状态转换图与词法分析器实现(第三章)3、正规式与正规集(第三章)4、确定有限自动机重点:1、状态转换图及其在词法分析中的作用2、正规式与正规集(特殊字集的重要性)3、确定有限自动机(状态转换图)与正规式的关系过程:1、开场,高级程序设计语言-文法-编辑程序的关系2、中间与学生交互1)词法分析与语法分析的关系2)词法分析器中存在的问题?3)提示:自动机(状态转换图)、正规式、3型文法都是语言(字集-单词)的描述3、总结:1)指出本节的重点2)下节内容简介编译第5次课:内容:1、非确定有限自动机-》确定有限自动机(确定化与化简)2、正规文法与有限自动机3、正规式与有限自动机重点:1、非确定有限自动机的确定化与化简2、正规式与有限自动机过程:1、开场,非确定有限自动机与确定有限自动机的区别2、各个步骤中发挥学生的主动思考(提问)提问1:在DFA化简时,开始设置的两个可区别的子集如何确定?3、总结:1)指出本节的重点2)下节内容简介编译第6次课:内容:1、确定有限自动机的与化简2、语法分析器功能及分析方法的引出3、LL(1)分析法重点:1、LL(1)分析法过程:1、开场,确定有限自动机的化简(状态等价与可区分性的含义)提问1:如何形成初始的两个子集的划分,即如何区分全部状态中的可区别性2、语法分析器功能及分析方法的引出(提问)强调:语法分析器的输入与输出,即与词法分析及后续处理的关系。
编译原理课件第3章
代码优化
代码优化的目的和分类
目的
提高程序运行效率,减少空间占用,提高可读 性。
局部优化
对单个程序块的优化,如基本块的优化。
全局优化
对整个程序的优化,如循环优化、死代码删除等。
代码优化的主要技术
常量折叠和替换
将常量表达式的结果在编译时计算出来,并 用结果替换掉表达式。
循环优化
编译原理课件第3章
contents
目录
• 词法分析 • 语法分析 • 中间代码生成 • 代码优化 • 目标代码生成
01
CATALOGUE
词法分析
词法分析器的任务
将源程序分解成一系列的记号(tokens) 去除源程序中的注释和空白符
识别出关键字、标识符、常量、操作符等记号 为语法分析器提供有序的记号流
通过改变循环的迭代顺序、减少循环中的计 算等方法来提高循环的效率。
死代码删除
删除永远不会被执行到的代码。
函数内联
将小的函数调用替换为函数体的直接执行, 以减少函数调用的开销。
代码优化的实现
编译器前端
负责将源代码转换成中间表示(IR),这一阶段主要 完成语义分析和语法分析。
编译器中端
对中间表示进行优化,如常量折叠、死代码删除等。
考虑文法的二义性
有些文法具有二义性,即一种语法结构可以有多种解析方 式。在设计语法分析器时需要考虑如何处理二义性问题, 避免产生错误的分析结果。
语法分析器的实现
编写词法分析器
词法分析器是将输入的字符串转 换成一个个的单词或符号,供语 法分析器使用。在实现语法分析 器之前,需要先编写词法分析器 。
实现递归下降分析
解析与语义分析
编译原理(3)语法_2(推导与语法树)
图3-4 句子i+i*i的语法树
4、一棵已经完成的语法树无法判断是来自于最左推导还 是最右推导,而使用文法规则的推导过程是有先后之分的。 如果坚持使用最左(或最右)推导,那么一棵语法树就完全 等价于一个最左(或最右)推导
•
棵不同的语法树:
最左推导1
E E E i E i E * E ii* E ii*i
最左推导2
E E * E E E * E i E * E i i* E i i*i
3.2
推导与语法树
3.2.2 语法树与二义性
–
3、语法的二义性
3.2
推导与语法树
3.2.2 语法树与二义性
–
2、子树与短语
•
语法树某个结点连同它的所有后代组成了一棵子树。只含有 单层分枝的子树称为简单子树。 子树与短语的关系十分密切,根据子树的概念,句型的短语、 直接短语、句柄和素短语的直观解释如下:
•
(1) 短语:子树的末端结点(即树叶)
组成的符号串是相对于子树根的短语; (2) 直接短语:简单子树的末端结点 组成的符号串是相对于简单子树根的 直接短语 b
都是指句型中的哪些符号串能够构成短语、直接短语、句
柄。脱离句型,谈论三者是无意义的。
例5.2 文法G E → T | E +T T → F | T * F F → i |(E) i1*i2+i3 是文法G的一个句型吗? 如果是,求出其句柄。
3.2
推导与语法树
3.2.1 推导与短语
–
4、素短语
编译原理3
有穷状态自动机 (Finite Automaton)
状态转换图 确定有穷状态自动机(DFA) 非确定有穷状态自动机(NFA) 把NFA变为DFA DFA的化简
11
什么是状态转换图?
为了识别正则文法的句子而专门设计的有向图。 如:C语言中关于标识符定义的规则(词法规则) 如下: <标识符>::=字母|<标识符>字母|<标识符> 数字
15
应用状态转换图识别句子举例
例如:对于正则文法G[Z]: Z::=Za|Aa|Bb A::=Ba|a B::=Ab|b
a S b A a b B b
a
Z a
a S b
A
a Z b
a b F
a,b
a b
B
(1)识别字符串ababaaa
(2)识别字符串bababbb
16
状态转换图识别句子的实质8语言的单词符号 Nhomakorabea
单词符号是程序语言的基本语法单位,一般分为下面5种: 关键字(基本字):(个数确定,可全体编为一类,也 可一字一类) 标识符:(个数不确定,作为一类) 常数:各种类型的常数 。(个数不确定,按类型分类) 运算符:如+、-、*、/、<等。(个数确定,一符一类) 界符:如,、;、(、)、: 等。(个数确定,一符一类) 注意:一种语言的单词如何分类、怎样编码,主要取决于 技术上的方便。
24
正则集
正则集:L(D),是一个DFA接受的字符串集合 正则语言与正则集:L(G)=L(D) 最小状态自动机:状态个数最少,唯一 如何减少自动机的状态数而不改变自动机所接受 的语言呢?
编译原理chapter3 词法分析
18
3.2.2 手工构造识Байду номын сангаас单词的DFA m
根椐DFA识别单词的定义,在研究给定程 序语言单词结构的基础上,能直接构造出识 别它的DFA m。例如:对于Pascal,
标识符:字母开始的字母数字串。 整数:非空数字串。 无符号实数(用表示数字): (a) dd.d dE(+- ) dd
3.1.3 词法分析程序作为一个独立子程序 (1)语法分析程序的子程序; (2)组织成一遍扫描。
3
While i<>j do if i>j then i:=i-j else j:=j-
I
词法分析器
‘while’,‘i’,‘<>’,‘j’, ‘do’,
‘if’,‘i’,‘>’,‘j’,‘then’,
读头
11
2. 状态集:它记忆已读入w子串的状态,m 是奇偶校验器,它应该记住,初始序列是奇 数个1还是偶数个1。因此,m有even和odd两 个状态. 3 .even为开始状态。
4 . 转换函数,(qold , ,a)=qnew
m有: (even ,,0)=even (even ,1)=odd
(odd ,0)=odd (odd ,1)=even
5
词法分析器的输出:
(词类编码,单词自身的属性值)
词类编码提供给语法分析程序使用;单词自 身的属性值提供给语义分析程序使用。具体 的分类设计以方便语法分析程序使用为原则。 关键字可分成一类,也可以一个关键字分成 一类。常数可统归一类,也可按类型(整型、 实型、布尔型等),每个类型的常数划分成 一类。单词自身的属性值提供的内容,是由 词法分析和语义分析的任务划分决定的。
编译原理(王晓斌)编译第三章课件
中间代码的形式
常见的中间代码形式包括三地址 代码、抽象语法树(Abstract Syntax Tree, AST)等。
三地址代码的生成
三地址代码的特点
三地址代码具有高度的局部性,便于 后续的优化和目标代码生成。
三地址代码的生成方法
常见的三地址代码生成方法包括递归 下降分析、预测分析等。
表达式的优化
数据流分析分类
根据数据流分析的侧重点不 同,可以分为值依赖分析、 活性变量分析、路径分析等
。
数据流分析应用
数据流分析在编译器优化中 主要用于确定变量的值在程 序执行过程中的变化情况, 从而帮助编译器进行更好的 优化。
控制流分析
控制流分析定义
01
控制流分析是一种静态程序分析技术,通过分析程序
中控制流的转移情况,来发现程序中的潜在问题。
分析器根据当前字符和当前状态,查找到对应的规则
,然后根据规则转换到新的状态和生成记号。
03
分析器会持续读取字符并重复上述过程,直到处理完
整个源代码。
词法分析的实现
01
词法分析器通常使用正则表达式或有限自动机来实 现。
02
正则表达式用于描述记号的模式,有限自动机用于 实现状态转换和记号生成。
03
分析器可以手动编写代码实现,也可以使用工具生 成。
词法分析概述
词法分析是编译过程的第一阶段,负责将源代码分解成一系列的记号( tokens)。
记号是源代码中的最小语法单位,例如关键字、标识符、常量、运算符等 。
词法分析器也称为扫描器或词法器,其任务是识别和生成记号序列。
词法分析过程
01
词法分析器从源代码的第一个字符开始读取,直到源
代码结束。
编译原理_课件_第三章_语法分析1
11
例3.1 试构造产生标识符的文法。
I→L|LS S →T|ST T →L|D L →a|b|c|d…|z|A|B…|Z|_ D →0|1|…|9
12
例3.2 写一文法,使其语言是奇数集合,但不 允许出现以 0开头的奇数。
N →A|MA M →B|MD A →1|3|5|7|9 B →1|2|3|4|5|6|7|8|9 D →0|B
4
二、形式语言
? Chomsky于1956年提出了一种用来描述语言的数学系统。 人们把用一组数学符号 和规则来描述语言的方式称为 形式 描述,而把所用的数学符号和规则称为形式语言。
? 形式语言,只是从语法上研究语言。它是抽象的数学系统, 用于模拟程序设计语言的语法,或者是并不很成功地模拟 自然语言如英语的语法。
特定的含义。 语用—在各个记号所出现的行为中,它们的来
源、使用和影响。
3
什么是符号与字母表?
? 字母表:由若干元素(符 号、字母)所组成的有限 非空集合。常用大写英文 字母A,B… 或希腊字母Σ 表示。
? 符号:可以相互区别的记 号(元素)。
? 例如:
Σ = {0,1} V = {a, b,c…z} A={begin,if,real,end}
7
引例2
有如下规则: <标识符>→<字母> <标识符> → <标识符> <字母> <标识符> → <标识符> <数字> <字母> → A <字母> → B <字母> → C <数字> → 0 <数字> → 1
编译原理第3节课第二章
n 的推导。
通常 , 长度 n 0 ( n 1 )的推导记为
0 n ( 0 n )
*
定义 2 . 4
*
设 G [ S ]是文法 ,
V ,若
*
S,
G
则称 是 G 的一个句型。
( 特别地,当句型
VT ,
*
则称
是 G 产生的句子 )。
例2.1:G[A]: A → Bb B→a
*
通常 , 我们把 是 的直接推导记为
G
或
U
G
当然,上述定义中的、、都可以是空串。另外,
推导符号‘’下面的G表示推导是以文法G的规则进 行的,若G无须指明,则可简写为
①<句子>::=<主语短语> <动词短语>
②<主语短语>::= the <名词>
• 从前面的推导看,从<句子>出发,经8步推导 得到了一个英语句子。故前面的推导称为长度 为8的推导。 • 若不关心推导的中间过程,可将从一符号串到 另一符号串的推导用记号 上例中经过 5 步的推导记为:
句子 the monkey
表示,例如,
动词 冠词 名词
等价的 , 当且仅当 L ( G 1 ) L ( G 2 )
例2.5
设 ={a,b},
A { ab a n 1 }
n
则产生语言A的文法如下: (1) A→aBa (2) A→aBa B→b|Bb B→b|bB
(3) A→aB
(4) A→aB
B→ba|bB
B→bC C→bC|a
2.3 句型的分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
b
2.3 有 限 自 动 机 优点:快速定位
• NFA的转换表
状 态 输 入 符 号
缺点:字母表过大 或大部分转换状态 为空集时浪费空间
a 0 1
2 识别语言 (a|b)*ab 的NFA
b {0} {2}
a
{0, 1}
开始
0 b
a
1
b
2
2.3 有 限 自 动 机
例 识别aa*|bb*的NFA
a
1 a 2 b 3 b 4
开始
0
2.3 有 限 自 动 机
2.3.2 确定的有限自动机(简称DFA) 一个数学模型,包括:
• 状态集合S; • 输入字母表; • 转换函数move : S S; • 唯一的初态 s S; b • 终态集合F S; 识别语言 (a|b)*ab 的DFA
2.3 有 限 自 动 机
2.3.3 NFA到DFA的变换
子集构造法 1、DFA的一个状态是NFA的一个状态集合 2、读了输入a1 a2 … an后, NFA能到达的所有状态:s1, s2, …, sk,则 DFA到达状态{s1, s2, …, sk} a a 开始 {0} {0, 1} a b 0 1 2 b
9
letter
10
other
*
11
return(install_id( ))
1、检查保留字表,如果在表中发现该词法单元则返回 相应的记号并退出,否则转向2 2、该词法单元是标识符,在符号表中查找,若找到该 词法单元则返回该条目的指针并退出,否则执行3 3、在符号表中建立一个新的条目,把该词法单元填入, 并返回此新条目的指针
b
b
2.3 有 限 自 动 机
2.3.3 NFA到DFA的变换
子集构造法 1、DFA的一个状态是NFA的一个状态集合 2、读了输入a1 a2 … an后, NFA能到达的所有状态:s1, s2, …, sk,则 DFA到达状态{s1, s2, …, sk} a a a 开始 {0} {0, 1} a b 0 1 2
开始 0 2 4 b a 3
输入符号 a b B
1
5
6
7
a
8
b
9
2.3 有 限 自 动 机
A = {0, 1, 2, 4, 7} B = {1, 2, 3, 4, 6, 7, 8} C = {1, 2, 4, 5, 6, 7}
开始 0 2 4 b a 3
b
C a B a C a B a b a, b E b
b
b
b
开始
A
a
b
a
开始 D
A
a
b
a
D
2.3 有 限 自 动 机
可区别的状态
A和B是可区别的状态 A和C是不可区别的状态
b
C a B a
b
b
开始
A
a
b
a
D
2.3 有 限 自 动 机
方法
1. {A, B, C}, {D} move({A, B, C}, a} = {B} move({A, B, C}, b} = {C, D} 2. {A, C}, {B}, {D} move({A, C}, a} = {B} move({A, C}, b} = {C}
a
输入符号 a b B C B D
1
5
6
7
8
b
9
2.3 有 限 自 动 机
A = {0, 1, 2, 4, 7} B = {1, 2, 3, 4, 6, 7, 8} C = {1, 2, 4, 5, 6, 7} D = {1, 2, 4, 5, 6, 7, 9}
开始 0 2 4 b a 3
状态 A B
输入符号 a b B C
1
5
6
7
a
8
b
9
2.3 有 限 自 动 机
A = {0, 1, 2, 4, 7} B = {1, 2, 3, 4, 6, 7, 8} C = {1, 2, 4, 5, 6, 7}
开始 0 2 4 b a 3
状态 A B C
输入符号 a b B C
2.3 有 限 自 动 机
2.3.3 NFA到DFA的变换
子集构造法 1、DFA的一个状态是NFA的一个状态集合 2、读了输入a1 a2 … an后, NFA能到达的所有状态:s1, s2, …, sk,则 DFA到达状态{s1, s2, …, sk} a a a 开始 {0} {0, 1} a b 0 1 2 b b a b {0, 2} b
2.2 词法记号的描述与识别
无符号数的转换图
num digit+ (.digit+)? (E (+ | )? digit+)?
E
digit digit digit E +/ digit digit
18
开始
digit 12 13
.
14
digit
15
16
17
other
other
other
*
19
1
5
6
7
a
8
b
9
2.3 有 限 自 动 机
A = {0, 1, 2, 4, 7} B = {1, 2, 3, 4, 6, 7, 8} C = {1, 2, 4, 5, 6, 7}
开始 0 2 4 b a 3
状态 A B C
输入符号 a b B C B
1
5
6
7
a
8
开始
A
2
b a
பைடு நூலகம்
b
b
a
D
2.4 从正规式到有限自动机
正规式 状态转换图
等价
计算机 实现
?
不确定有 限自动机 本节内容
有限自动机
确定有限 自动机
2.4 从正规式到有限自动机
首先构造识别和字母表中一个符号的NFA
开始
i
f
开始
i
a
f
识别正规式的NFA
识别正规式a的NFA
2.4 从正规式到有限自动机
一个数学模型,它包括: 缺点:1、输入字 符包括 状态集合S; 2、一个状态对于 输入符号集合; 某个字符,可能有 转换函数move : S ({}) P(S); 多条输出边 状态s0是开始状态; F S是接受状态集合。 a
识别语言 (a|b)*ab 的NFA 开始 0 a 1 b 2
开始 0 a
优点:1、输入字 符不包括 2、一个状态对于 某个字符,只可能 存在唯一条输出边
b b 1 a 2
a
2.3 有 限 自 动 机
2.3.3 NFA到DFA的变换
子集构造法 DFA的一个状态是NFA的一个状态集合 读了输入a1 a2 … an后, NFA能到达的所有状态:s1, s2, …, sk,则 DFA到达状态{s1, s2, …, sk} a 开始 0 b a 1 b 2
b
b
2.3 有 限 自 动 机
2.3.3 NFA到DFA的变换
子集构造法 1、DFA的一个状态是NFA的一个状态集合 2、读了输入a1 a2 … an后, NFA能到达的所有状态:s1, s2, …, sk,则 DFA到达状态{s1, s2, …, sk} a a a 开始 {0} {0, 1} a b 0 1 2 b b {0, 2} b
A = {0, 1, 2, 4, 7} B = {1, 2, 3, 4, 6, 7, 8} 状态 A
开始 0 2 4 b a 3
输入符号 a b B
1
5
6
7
a
8
b
9
2.3 有 限 自 动 机
A = {0, 1, 2, 4, 7} B = {1, 2, 3, 4, 6, 7, 8} 状态 A B
return( install_num( ) )
2.2 词法记号的描述与识别
空白的转换图
delim blank | tab | newline ws delim+ delim 开始 delim other 22 *
20
21
2.3 有 限 自 动 机
正规式
?
状态转换图
等价
计算机 实现
有限自动机
a
2.3 有 限 自 动 机
b 开始 b b a 1 a 2 2 4 b a 3 开始 A b a b 2 b C a B b a
0
开始
0 b
a
1
b D
a
a
a b
开始 0
1
5
6
7
8
9
2.3 有 限 自 动 机
2.3.4 DFA的化简
死状态 左图无须加死状态,右图加入死状态E。
构造识别主算符为选择的正规式的NFA
N (s)
不确定有 限自动机
确定有限 自动机
2.3 有 限 自 动 机
识别器:是一个程序,取串x作为输入,当 x是语言的句子时,它回答“是”,否则回 答“不是”。 状态转换图(有限自动机)识别器 确定/不确定有限自动机——时空权衡问题
确定有限自动机:快,空间大
2.3 有 限 自 动 机
2.3.1 不确定的有限自动机(简称NFA)
b D
a
a
a b
开始 0
1