第三章 词法分析
一、知识点
词法分析的任务:从左至右逐个字符的对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为由单词符号串组成的程序。
词法分析器的结构:输入缓冲区、预处理子程序、扫描缓冲区、扫描器。
单词符号的识别:
1. 超前搜索:在单词识别的过程中,通过向前多读几个符号的形式,准确的进行单词的识别
一旦确定识别到的单词之后,需要进行扫描指针的回退,保证单词识别工作的顺利进行
2. 直接分析法:根据读来的第一个字符的种类分别转到各种子程序处理。这些子程序功能就是识别以相应字符开头的各种单词。
3. 状态转换图法:
(1)状态转换图:一张有限方向图。
(2)状态转换图的功能:识别一定的符号串(单词)。
(3)状态转换图的结构
①结点:代表状态,用圆圈表示
②箭弧:状态之间用箭弧连接
③箭弧上的标记:代表在射出节点下可能出现的字符或字符串
正规式与正规集的定义:
(1)ε和φ是∑上的正规式,它们所表示的正规集分别为{ε}和φ
(2)任何a∈∑,是∑上的一个正规式,他所表示的正规集为{ a }
(3)假定U和V都是∑上的正规式,他们所表示的正规集分别记为L(U)和L(V),那么
(a) (U|V)是正规式,所表示的正规集为L(U)∪L(V)
(b) (UV)是正规式,所表示的正规集为L(U) · L(V)(连接积)
(c) (U)*是正规式,所表示的正规集为 (L(U))*(闭包)
仅由有限次使用(1)(2)(3)所得到的表达式才是∑上的正规式,仅由这些正规式所表示的字集才是∑上的正规集。
确定的有限自动机(DFA)
定义:一个确定有限自动机(DFA)M是一个五元式:
M = (S, ∑, f, s0, F),其中
(1)S是一个有限的状态集合,它的每个元素我们称为一个状态
(2)∑是一个有穷的输入符号的字母表,它的每个元素我们称为一个输入字符
(3)f是从 S×∑ →S的单值部分映射
(4)s0是S的一个元素,为初始状态,它是唯一的
(5)状态集合F是终止状态的集合,它是S的子集(可空)
非确定的有限自动机(NFA)
定义:一个非确定有限自动机(NFA)M是一个五元式
M = (S, ∑, f, S0, F),其中
(1)S是一个有限的状态集合,它的每个元素我们称为一个状态
(2)∑是一个有限的输入符号的字母表,它的每个元素我们称为一个输入字符
(3)f是从S×∑*→2S 的部分映射,其中,2S表示S的幂集合(所有S的子集组成的集合)(f是非单值的M是非确定)
(4)状态集合S0是初始状态集合,它是S的子集
(5)状态集合F是终止状态的集合,它是S的子集
化简DFA的一般步骤
(1) 检查状态转换函数是否为全函数。
所谓全函数,是指每个状态对每个输入符号都有转换
若不是全函数,可以引入一个“死状态”d,d对所有输入符号都转换到d,如果状态s对输入符号a没有转换,那么加上从s 到d的a转换。
(2) 用化简算法进行化简
(3) 去掉死状态
DFA化简算法
(1)基本思想:把M的状态集分割为一些不相交的子集,使得任何不同的两个子集状态都是可区别的,而同一个子集中的任何状态都是等价的,最后让每个子集选一个代表,同时消去其他等价状态。
(2) 化简算法
①对M的状态集S进行划分:
把S的终态和非终态分开,分成终态集合非终态集,形成基本分划П,显然这两个子集是可区别的。
②假定到某个时候П含有m个子集,
记П={I(1),I(2),… I(m)}
并且,属于不同子集的状态是可区别的。
检查П中的每个I(i)看能否进一步划分:
对于某个I(i)
另I(i)={q1 ,q2 ,…,qk}
若存在一个输入字符a使得I(i)a不全包含在现行П的某个子集I(j)中,就将I(i)一分为二
二、应用
三、学习感受
通过对第三章的学习,让我了解了词法分析器的结构,其中重点是状态图的转换法。学习了正规式与正规集,以及把状态转换图再形式化——有限自动机,分为DFA和NFA,对于DFA的确定化和最小化是有难度的。课上老师讲的时候自己能听明白,老师带着讲例题自己也能理解,但当自己去做课后题的时候,却一脸懵,自己理解的不够透彻,自己加强做题实践就能更可以更进一步。