第三章 词法分析
l 词法分析器的要求
n 任务:从左至右逐个字符的对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为由单词符号串组成的程序
n 单词的种类(基本字、标识符、常数、运算符、界符)
n 单词表示形式
二元式:<单词种别,单词符号的属性值>
l 词法分析器的设计
n 词法分析器的结构
n 功能:
u 输入缓冲器、预处理子程序
u 扫描缓冲区、扫描器
n 单词符号的识别
u 超前搜索:在单词识别的过程中,通过向前多读几个符号的形式,准确的进行单词的识别;一旦确定识别到的单词之后,需要进行扫描指针的回退,保证单词识别工作的顺利进
u 直接分析法
u 状态转换图法:一张有限方向图
状态转换图的结构(结点、箭弧、箭弧上的标记)
一个完整的状态转换图有n个状态,其中有一个初态,至少要有一个终态(用双圆圈表示)
[例] 识别实型常数的状态转换图
l 正则表达式和有限自动机(重点)
n 正规式与正规集
u 把具有相同特征的字放在一起组成一个集合,即所谓的正规集
u 然后使用一种形式化的方法来表示正规集,即所谓的正规式
n 正规式与正规集的定义(递归的定义方法)
(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)所得到的表达式才是∑上的正规式,仅由这些正规式所表示的字集才是∑上的正规集。
注:|(或)、 ·(连接)、*(闭包,任意有限次的自重复连接)
运算的优先级为:“ * ” > “· ” > “ | ”
n 两个正规式的等价
若两个正规式U和V所表示的正规集相同,则认为二者等价,记为:
U = V
n 正规式的性质
设U,V,W是上的∑正规式,则
(1) U | V = V | U 或的交换律
(2) U | ( V|W ) = ( U|V ) | W 或的结合律
(3) U ( VW ) = ( UV ) W 连接积的结合律
(4) U ( V | W ) = ( UV ) | ( UW ) 分配律
( V | W ) U = VU| WU
(5) εU = Uε = U
[题5]
[题6]
n 确定有限自动机(DFA)(DeterministicFinite Automata)
u 定义:一个确定有限自动机(DFA)M是一个五元式:
M = (S, ∑, f,s0, F),其中
1) S是一个有限的状态集合,它的每个元素我们称为一个状态
2) ∑是一个有穷的输入符号的字母表,它的每个元素我们称为一个输入字符
3) f是从 S×∑ →S的单值部分映射
4) s0是S的一个元素,为初始状态,它是唯一的
5) 状态集合F是终止状态的集合,它是S的子集(可空)
u 注意:
1) 所谓确定性是指,f(s, a) = s’ 是单值函数。对任何状态s∈S,和输入符号 a∈∑ , f(s, a) 唯一的确定下一个状态
2) 所谓有限性是指,S是一个有限的状态集合,并且∑是一个有限的输入符号的字母表
u 表示方法:矩阵法、状态转换图法
n 非确定有限自动机(NFA)(Non-deterministicFinite Automata)
u 定义:一个非确定有限自动机(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的子集
u 表示方法:状态矩阵表示、状态转换图表示
n 有限自动机的等价性
对任何两个有限的自动机M1和M2,若有L(M1)=L(M2),则称M1与M2等价。
n 正规式与有限自动机的等价性
1) 定理1:对于任何∑上NFA M都可构造一个∑上的正规式V,使得 L(V) = L(M)
其中,L(M)是∑上NFA M所能识别的字的全体,L(V)是∑上的正规集
[问题] 如何由一个NFA M,构造一个正规式V
i. 在M转换图上加进X结点和Y结点,从X结点用弧ε连接M的所有初态结点,M的所有终态结点用弧ε连接到Y,得到一个NFA M’,且L(M) = L(M’)
ii. 使用替换规则逐步消去M’的所有结点,直到只剩下X结点和Y结点,在消去过程中,逐步使用正规式来标记箭弧
2) 定理2:对于∑上的每一个正规式V,存在一个∑上的DFA M,使得L(M) = L(V)
[问题] 如何由一个正规式V,构造一个DFA M
1. 构造NFA(根据V,构造一个NFA M’,使得L(M’) = L(V) )
2. 确定化 (将M’确定化,变为DFA M)
3. 最少化
[问题] 如何由一个正规文法转化成一个 DFA M
与上述类似,非终结符为状态结点,弧为终结符
定义2:假定I是M’的状态集的子集,a ∈ ∑,定义
Ia =ε_CLOSURE(J)
其中,J是所有那些可从I中的某一状态结点出发经过一条a弧而到达的状态结点的全体
n 确定有限自动机的化简(最少化)
u 状态等价:两个状态读出同一个字都停在终态
u 状态可区别:若DFA M的两个状态s和t不等价,则称这两个状态是可区别的
注:终态和非终态是可区别的,因为终态可以读出空字ε,而非终态不能读出空字ε
u 化简DFA步骤
1. 检查状态转换函数是否为全函数,若不是引入一个死状态,死状态对所有输入符号都转换到本身。
2. 用化简算法进行化简
n 化简算法
1) 假定到某个时候П含有m个子集,
记П={I(1),I(2),…I(m)}
若存在一个输入字符a使得I(i)a不全包含在现行П的某个子集I(j)中,就将I(i)一分为二
2) 重复1) 划分到所有子集可区别
3) 对于这个П中的每个子集,选取子集中的一个状态代表其它状态。
3. 去掉死状态
[题7(1)]
[题(2)]
[题12(1)]
[题12(2)]
个人感想:这一章的东西好多,构造一个最小化的DFA很重要,本章的所有知识点都在为这个操作服务。自己的形式化语言阅读能力欠佳,看课本上密密麻麻的符号定义看的很头疼。手工构造DFA着实麻烦,清明找时间编写一下状态转换的代码。