Chapter 9 Finite Automata
9.1 Finite Automata and Regular Languages
这一小节的内容是有限状态机和正则语言。其实很多讲解编译器的书籍都有相关的论述,而且都比本书更加严谨和通俗易懂。没什么难度,我就不详细讲解了。只是列出几个关键点
- NFA与DFA
- 闭包
- string与tape的区别,一个有限,一个无限
- 正则表达式中的运算如*,|,+..都是作用于sting not tape
9.2 DFA Synthesis
主要有三步
- 给定一个正则表达式(a*b)*构建一个二叉解析树
- 深度搜索解析树, 后序访问各个节点,按照节点的操作符合并左右孩子的NFA。合并规则很简单,一看就懂。比如已知NFA a和NFA b,如何构造出NFA c = ab.
- 将NFA转换成DFA,两种-------子集构造法和deterministic image法
9.2.2 The Subset Construction
经典的方法,每本编译器的教材都有相关的内容。基本思路就是从NVA的起始集合开始,求出的闭包,作为DFA的起始状态. 依次遍历输入集合,假设访问到输入x,求出中每个状态遇到x后可能到达的状态集合,求这些集合的并集,继而求出的闭包. 如果 之前没有出现过,就把它加入DFA的状态集合,并从到加一条标记为x的边。 这个过程持续下去,就得到DFA。可见DFA的一个状态对应了NFA的一个状态集。如果这个NFA状态集包含了NFA的接受状态,相应的DFA状态也标记为接收状态。
书中给出的子集构造法的伪代码是错的。从某个NFA状态集合闭包起,对每个输入x都做出一个DFA的状态。而不是像书中那样,对所有输入得到的状态集合再求并集。 可以参考编译器领域的龙书。
9.2.3 The Deterministic Image
由于子集构造法中,DFA的状态空间是NFA状态空间的幂集,在极不走运的情况下,可能面临存储空间过大的问题。本节介绍另一种NFA转DFA的方法------The deterministic image。
可见NFA 的deterministic image是一个DFA . 二者的状态集一样,但是输入集合大不相同。的输入集是的输入集与状态集的笛卡尔积。 假设中有两个转换,和,在中转化成另外两个变换和。 显然这些变换分别符合NFA和DFA的特点。
Deterministic image方法的状态空间不变,输入空间增长了|S|倍。显然小于S的幂集的数目。
9.3 -Regular Automata
从本节开始,进入本章的难点。NFA和DFA通常是用来处理string的,即有限的序列。它们都需要指定一些接受或终止状态。而-自动机是处理tape,即无限的序列。其中简单的一种叫做L-automaton。
定义很复杂,但是关键点如下
没有了终止状态,但是如何判断一个tape属于该L-自动机,换句话说,如何判断一个输入tape是合法的呢。L-automaton定义了一个cycle sets-------, 是自动机状态集合的一个子集。L-自动机判定输入合法的条件有两个,任何一个成立都行。
- 输入会无数次经过自动机有向图的某条边,该条边被成为recur edge。
- 输入无数次经过的哪些状态的集合是某个的子集。由于输入是无限的tape,而L-自动机的状态是有限的,假设某个状态ss被无数次经过,说明ss必然属于某个cycle中。这就是cycle sets名字的由来。
9.4 Formal Verification with L-Automata
9.4.1 -Regular Languages
主要定义了两种操作和。需要注意和*的区别,前者用于产生tape,后者用于产生string。假设,则表示由a,b,c组成的所有无限长的tape的集合ÿ