1、第3章 词法分析,词法分析(Lexical Analysis) 词法的表示 词法分析器的设计与实现,2,回顾: 词法分析,任务:从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词符号。,单词:标识符,保留字,常数,算符,界符 词法分析阶段的工作所依循的是语言的词法规则。描述词法规则的有效工具是正规式和有限自动机。,3,有限自动机(FA),自动机是一种能进行运算并能实现自我控制的装置。一台储存有程序的传统计算机,在有合适电源的条件下不仅具有进行运算的能力,而且具有自我控制的能力,所以,计算机是一部自动机。 所有实际的计算装置均以某种方式受限于它所能储存
2、的信息量,因此是有限的。 自动机是描述符号串处理的强有力的工具,因而自动机成为研究词法分析器的重要基础。有限自动机(FA)分为确定有限自动机(DFA) 和不确定有限自动机(NFA) 。 本节介绍有限自动机的基本概念,以及有限自动机与正规式、正规文法之间的等价关系。,4,3.3.2 确定有限自动机(DFA),一个确定有限自动机(DFA) M是一个五元式M= (S, , , s0, F) (1) S 是一个有限集,它的每个元素称为一个状态。(2) 是一个有穷字母表,它的每个元素称为一个输入字符。(3) 是一个从 S 至 S 的单值部分映射。(s, a)=s 意味着:当现行状态为s, 输入字符为a时
3、,将转换到下一个状态s。我们称s为s的后继状态。后继状态是唯一确定的, 故称确定有限自动机。(4) s0 S,是唯一的初态。(5) F S,是一个终态集(可空)。,2019/5/27,Ch3.词法分析,5,参见P4748. 例1 设有DFA:M=(0,1,2,3,a,b, ,0,3)其中 为: (0,a)=1 (0,b)=2(1,a)=3 (1,b)=2 (2,a)=1 (2,b)=3(3,a)=3 (3,b)=3 注意: 后继状态不一定是按顺序的下一个,只要是状态集合的一个状态即可。,DFA:例1,6,显然, DFA可以用一个矩阵表示 该矩阵的行表示状态 列表示输入字符,矩阵元素表示(s,a
4、)的值 该矩阵称为状态转换矩阵或状态转换表 如例1 的 DFA M=(0,1,2,3,a,b, ,0,3)所对应的状态转换矩阵如 P48.表3.2,DFA表示为 - 状态转换矩阵,7,DFA也可以表示成一张确定的状态转换图。 假定DFA M含有m个状态n个输入字符,那末这张图: 含有m个状态结点 每个结点顶多有n条箭弧射出和别的结点相连接 每条箭弧用上的一个不同字符作标记 整张图含有唯一的初态和若干个(可以是0个)终态结点。 某个结点可以既是初态同时又是终态。,DFA表示为 - 状态转换图,8,例1的DFA M=(0,1,2,3,a,b, ,0,3) 所对应的状态转换图如 P48.图3.5,D
5、FA表示为状态转换图:例,以后,将不加区别的使用DFA和状态转换图。,9,DFA识别(读出,接受)字,DFA识别字 对于*中的任何一个字,若存在一条从初态结点到某一终态结点的通路,且这条通路上所有箭弧的标记符连接成的字等于,则称为DFA M所识别。 例: 图3.5的DFA识别字abbab, 因为存在路径 012333;但不接受字ababa, 因为不存在识别路径。,10,DFA识别字、语言L(M),DFA识别空字 若M的初态结点同时又是终态结点,则称空字可以为DFA M所识别。 例: 图3.5的DFA不识别空字。 DFA M所能识别的字的全体记为L(M)。 例:图3.5的DFA M识别的字的全体
6、L(M) =上所有含有相继两个a或相继两个 b的字,2019/5/27,Ch3.词法分析,11,DFA:说明,1. DFA M的输入字母表为, 则称M是上的一个DFA。 2. DFA M的确定性表现在映射: SS是一个单值函数。 3. 上的一个字集V*是正规的, 当且仅当存在上的DFA M, 使V=L(M)。 这样,把DFA与正规表达式联系起来了,事实上,它们是等价的。,12,DFA:练习1,设有 DFA M=(0,1,2,a,b,0,1,2)其中: (0,a)=2; (0,b)=1(1,a)=; (1,b)=2(2,a)=2; (2,b)=2 问:该DFA有几个状态?几个输入字符?初态?终态
7、?画出其转换图。,解:有0,1,2共三个状态。0为初态,1和2为终态。输入字符为a,b两个。 其状态转换图如:,13,解释下面每个有限自动机识别的语言是什么?,DFA:练习2,含偶数个 0的二进制数串的集合,含(1+5*n)个a的符号串组成的集合, n0,2019/5/27,Ch3.词法分析,14,给出接受下列在字母表0,1上的语言的DFA:( a ) 所有以00结束的串的集合;(b) 所有二进制串中只包含3个0的集合。,DFA:练习3,15,3.3.3 非确定有限自动机(NFA),一个非确定有限自动机(NFA)是一个五元式M= (S, ,S0, F) (1) S 同DFA ,状态集,非空有限
8、集(2) 同DFA,有穷字母表,输入字符集(3) 是一个从S*到S的子集的映射,即:S*2s意味着(s,)=s1,s2,sm,可以是(4) S0S,是一个非空的初态集(5) F S,是一个终态集(可空),16,NFA表示成一张状态转换图,显然,NFA也可以表示成一张状态转换图。假定NFA 含有m个状态n个输入字符,那末: 这张图含有m个状态结点 每个结点可射出若干条箭弧和别的结点相连接 每条箭弧用 *上的一个字(不一定要不同的字而且可以是空字 )作标记(称为输入字) 整张图至少含有一个初态,若干个(可以是0个)终态结点 某些结点可以既是初态同时又是终态结点 我们将不加区别的使用NFA和状态转换
9、图。,17,NFA:例,设 NFA M = (S, ,S0, F)其中,S=X,1,2,3,4,5,6,Y =a,b:(X,)=5; (5,a)=5; (5, b)=5;(5,)=1; (1,a)=3; (1, b)=4;(3, a)=2; (4,b)=2; (2,)=6;(6, a)=6; (6,b)=6; (6,)=Y。S0=X F=Y 对应的状态转换图,P49.图3.6,18,NFA识别字、空字、L(M),1. NFA识别字 对于*中的任何一个字,若存在一条从初态结点到某一终态结点的通路,且这条通路上所有箭弧的标记符连接成的字(忽略那些标记为的弧)等于,则称为NFA M所识别(读出或接受
10、)。 2. NFA识别空字 若M的初态结点同时又是终态结点; 或者存在一条从某个初态结点到某个终态结点的通路,则称空字可以为M所识别。 3. NFA M识别的上字的全体记为L(M)。,19,NFA:例1,例1 图3.6的 NFA M:,识别字 abbab,路径是X55142666Y 不接受字 ababa,不接受 L(M)=上所有含有相继两个a 或相继两个b的字,注意: 图3.5的DFA与图3.6的NFA识别的字集相同,两个FA等价。,20,NFA:练习,练习1 如图的FA M 是NFA吗? L(M)=?,是NFA L(M)=ambn|m,n0,练习2 如图的FA M 是NFA吗? L(M)=?
11、,是NFA L(M)=所有含有相继两个a或相继两个b的字,21,DFA与NFA的区别,1. 显然DFA是NFA的特例。 2. DFA与NFA的区别: 初态: 数目, 集合与否 状态转换函数: S x S, S*2s 状态图上: 射出的箭弧数, 弧上的标记形式 3. FA的等价性 对于每个NFA M, 都存在一个DFA M,使得L(M)=L(M)。 后面有证明, 这个证明需要掌握, 它给出了NFA确定化为DFA的方法。,22,定理 对任何一个NFA M,都存在一个DFA M”,使L(M”)=L(M)。 证明思想:用M”的一个状态对应M的一个状态集合,用这种方法,能从一个NFA M构造一个DFA
12、M”,称作子集构造法。 证明过程, 即NFA确定化为DFA的方法。 分两步: 1. 改造NFA M为NFA M, 使 L(M)=L(M) 2. 将NFA M变换为DFA M”, 使 L(M”)=L(M) 以一个例子说明NFA确定化为DFA的方法。,FA的等价性(P4951.),23,1. 改造NFA M为NFA M,方法: 引入新的初态结X和终态结Y,用弧连接原初态和终态结。 利用P50.图3.7的替换规则,不断引入新的状态结,分裂弧上的标记,直到每条弧上的标记为或中的单个符号为止。,FA等价性证明1步(P49.),24,例. 改造NFA M为NFA M,FA的等价性证明1步:例,25,FA等
13、价性证明2步: 子集法(1),2. 将NFA M变换为DFA M”-子集构造法 (1) 先定义状态子集 I 的闭包: _CLOSUR(I) 若qI , 则q _CLOSUR(I); 若qI , 则从q出发经任意条弧而能到达的任何状态q _CLOSUR(I)。 例: 若 I=X 则_CLOSUR(I)=X, 5, 1I=5, 1 _CLOSUR(I)=5, 1I=2 _CLOSUR(I)=2, 6, Y,26,FA等价性证明2步(2),2. 将NFA M变换为DFA M”-子集构造法 (2) 再定义状态子集 Ia = _CLOSUR(J) 其中, J = q | (q, a) = q且 qI ;
14、 a 表示: J是从I中的状态结点出发经过一条a弧而到达的状态结点的集合。 例:若 I=5 则 J = 5 Ia = 5, 1 I=X, 5, 1 J = 5, 3 Ia = 5, 3, 1,计算Ib=?,27,FA等价性证明2步: 子集法(3),(3) 构造一张状态转换子集表。设= a1,a2, , ak 第一行第一列为 I =_CLOSUR(X),X是唯一的初态;以此 I 求 Ia1,Ia2,Iak。 把没有在第一列出现过的Iai填入空行第一列,以此 Iai为新的 I,再求 Ia1,Ia2,Iak。 重复的过程,直到所有求出的 Iai 都在第一列出现为止。,FA等价性证明2步: 子集法例,
15、对图3.6的NFA构造一张状态子集表。= a, b , X, 5, 1 初 0, 5, 3, 1 1, 5, 4, 1 2, 5, 3, 1 1, 5, 3, 1, 2, 6, Y 3, 5, 4, 1 2, 5, 4, 1 2, 5, 3, 1 1, 5, 4, 1, 2, 6, Y 5, 5, 3, 1, 2, 6, Y 终3, 5, 3, 1, 2, 6, Y 3, 5, 4, 1, 6, Y 4, 5, 4, 1, 6,Y 终 4, 5, 3, 1, 6, Y 6, 5, 4, 1, 2, 6, Y 5, 5, 3, 1, 6, Y 终6, 5, 3, 1, 2, 6, Y 3, 5,
16、 4, 1, 6, Y 4, 5, 4, 1, 2, 6, Y 终5, 5, 3, 1, 6, Y 6, 5, 4, 1,2,6,Y 5,29,FA等价性证明2步: 子集法(4),2. 将NFA M变换为DFA M”-子集构造法 (4) 由状态子集表构造DFA的状态转换表。 NFA M的每个状态子集是DFA M”的一个状态 - 重新编号。 DFA M”唯一的初态是_CLOSUR(X) 对应的状态子集。 DFA M”的终态是含有原来的终态Y的状态子集。 (5) 如此, 构造出了DFA M”, 从构造过程可知, M”满足: L(M”)=L(M)=L(M)。,30,NFA的确定化(子集法):例3.3,例3.3 正规式(a|b)*(aa|bb)(a|b)*,对应的NFA见P49.图3.6,转换得到等价的DFA见P51.图3.8。,注1:子集法进行确定化的关键在于构造状态转换表,即正确求出各个Ia。 注2:如果NFA只有一个初态,则不必引入新的初态结X,新的终态结Y可以不引入以简化求Ia 的工作。,31,NFA确定化:练习1,设有NFA M=(x,y,a,b,x,y), 其中定义如下:(x,a)=x,y (x,b)=y(y,a)= (y,b)=x,y试构造相应的 DFA M。,32,给出接受在字母表0,1上所有以00结束的串的DFA:,NFA确定化:练习2,确定化,