1、1,南京邮电大学计算机学院 蒋凌云 教材:编译技术原理及其实现方法王汝传 编著,编 译 原 理 Compiler Principles,2,第三章 词 法 分 析,3.1 引言一、词法分析基本思想二、词法分析任务三、词法分析方式四、词法分析方法 3.2 单词的内部编码一、单词二、内部编码 3.3 正规文法和状态转换图一、正规文法二、状态转换图三、正规文法与状态转换图 3.4 词法分析程序设计与实现一、源程序的输入二、缓冲区及预处理三、超前搜索四、由词法语法规则画状态转换图五、词法分析程序的设计与实现,3.5 正规文法和有穷自动机一、用正规文法描述单词二、由正规文法构造状态转换图三、有穷自动机F
2、A四、有穷自动机和正规文法的关系五、DFA与NFA的关系 3.6 正规表达式和有穷自动机一、正规表达式和正规集的定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机四、由正规表达式构造确定有穷自动机五、确定有穷自动机的化简 3.7 词法分析程序的自动生成一、问题的提出二、语言LEX一般描述三、LEX编译程序的实现四、LEX目标程序,3,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确
3、定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,4,3.6正规表达式和有穷自动机,由正规文法构造状态转换图,再根据状态转换图可以构造有穷自动机,往往很麻烦,但是,对于一些复杂的正规文法,如果将其先转换成正规表达式,再由正规表达式来产生有穷自动机就方便得多。而且正规表达式的引入有助于词法分析程序的自动生成,它还广泛应用于模式识别和文献目录检索等。,为什么引入正规表达式?,5,什么叫正规表达式?首先我们来看一个例子,如:对于数字集合D=0,1,2,9,现在要用一个表达式刻画符号串20这个数,可以将20看成2和0组成的符号
4、串,也可以用4*5表示,或用0+1+2+3+4+9+9-8表示。同样,在词法分析阶段,我们也要解决某字母表上语言的表示问题(所谓语言就是*上一个子集,即某些符号串集合。)例如: 0,1上一个语言L(G)=xx以0开头后面跟任意个1 ,这可以采用如下方法表示: 枚举法: L(G)=0,01,011,0111 文法生成法 Z =0|Z1 自动机识别法:可以构造一个DFA来识别该语言 正规表达式:可用正规表达式来表示一个正规语言,象用4*5表示20一样,可以用0(1)* 表示0后跟若干个1的二进制数。,6,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义
5、2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,7,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确
6、定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,8,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,9,3.6正规表达式和有穷自动机一、正规表达式和正规集定义,1. 非形式定义用来表示字母表上字符串集合*某些子集,经过运算符|(和)、(连接)、*
7、(闭包)以及决定运算顺序的括号组合成一个有意义的集合运算式,称为正规表达式;正规表达式的值称正规集。,注意:正规表达式是表示运算的一个式子,而正规集是一个符号串集 合,是正规表达式的运算结果。 例如上面的例子, 0,1其0(1)* 是正规表达式, 而集合0,01,011,0111是0开头后面跟任意个1,是正规集,也可以写成 0(1)* 0,01,011,0111,运算优先级:*, , |,10,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机
8、1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,11,3.6正规表达式和有穷自动机一、正规表达式和正规集定义,2.递归定义令为有穷字母表,则上的正规式和正规集可递归定义如下: .和是上的正规式,则它们相应正规集分别为和; .对于每一a,a是上一个正规式,则它所表示相应正规集为a; .如果e1和e是上的正规式,则相应正规集分别为L(e1)和(e2),则(1)(e1)是正规式,其相应的正规集为L(e1)=L(e1) (2)e1e是正规式,其相应正规集为(e1e)(e1)
9、(e); (3)e1e2是正规式,其相应正规集为(e1e2)(e1)(e2); (4)(e1)*是正规式,其相应正规集为(e1)*)((e))*。 ,12,例3.5 设a,b,下列各式:a* ba* aba* aabbabba a(ab)* (ab)*(aabb)(ab)* (a|b)(a|b)(a|b)(a|b)*均是上正规式,则它们相应的正规集分别是,(a*)((a)*a*,a,aa,aaa, (ba*)(b)L(a*)b,ba,baa, (aba*)(a)L(ba*)a,b,ba,baa, L(aabbabba) L(aa)L(bb)L(ab)L(ba)aa,bb,ab,ba (a(ab
10、)*)L(a)(L(a)L(b)*aa,b* ((ab)*(aabb)(ab)*)a,b*aa,bba,b* L(a|b)(a|b)(a|b)(a|b)*) =L(a|b)L(a|b)L(a|b)L(a|b)*) =a,ba,ba,ba,b*,13,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念
11、2.确定有穷自动机的化简方法,14,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,15,3.6正规表达式和有穷自动机二、正规表达式的性质,1.若两个正规式所表示正规集相同,则认为两者等价。 两个正规式e1和e2等价,记为e1e2 。例如:e1=b(ab)* ,e2=
12、(ba)*b 因为L(e1)=L(b(ab)*)=L(b)(L(ab)*=bab*=b,bab,babab,L(e2)=L(ba)*b)=(L(ba)*L(b)=ba*b=b,bab,babab 所以e1=e2,它们所表示的正规集都是以b开头其后跟零个或任意多个ab所组成的。即L=b(ab)n|n0,16,2.其他性质(1)e1e2e2e1 (2)e1(e2e3)(e1e2)e3(3)e1(e2e3)(e1e2)e3 (4)e1(e2e3)e1e2e1e3 (5)e1e1e1(6)e1e1(7)(e1*)*e1* (8)(e1)*e1 * 根据定义比较容易证明上述性质,利用这些性质可以化简正规
13、式,证明正规式的等价关系,说明:*上的某些集合若不能用正规表达式表示,则该集合不是正规集。 如: =a,b,L(G)=anbn| n0就不是正规集,因为它不能用正规式表示。(可以用上下文无关文法Z=aZb|ab|产生)可以证明,凡是由正规文法所产生的语言一定是正规集,即可由正规式表示 。,17,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式
14、五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,18,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,19,3.6正规表达式和有穷自动机 三、正规文法、正规表达式与有穷自动机的关系正规文法、正规表达式与有穷自动机的关系可以通过如下Kleen
15、定理描述:定理:L是正规集存在一个有穷自动机(FA)M,使得L=L(M)存在一个正规文法G,使得L(M)=L(G) 存在一个正规表达式e,使得 L(e)=L(G),20,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,21,第三章 词 法 分 析,3.6正规表达式和有
16、穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,22,3.6正规表达式和有穷自动机四、由正规表达式构造确定有穷自动机DFA由Kleen定理知,对应于一个正规表达式,总存在一个DFA,使得该DFA所识别的语言就是正规表达式的值(正规集)。下面我们就来介绍由正规表达式构造有穷自动机的方法步骤:正规表达式构造转换系统
17、 NFA(状态转换图) NFA DFA步骤 , 我们已经简单介绍过,下面主要介绍步骤 , 。,23,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,24,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规
18、表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,25,1. 由正规表达式e构造转换系统 (广义转换图)(1) 转换系统的定义 所谓转换系统是一个具有唯一开始状态和唯一最终状态的一种 特殊状态图。其条件是: 1)没有弧引向开始状态 只引出2)没有弧从终止状态引出 只引入3)转换系统的弧可以用空符号标记。如:,S,S,1,S,1,2,a,b,3.6正规表达式和有穷自动机四、由正规表达
19、式构造确定有穷自动机,26,(2)转换系统与有穷自动机状态转换图的区别 1) 有穷自动机状态转换图开始状态和终止状态不唯一 2) 有穷自动机状态转换图弧上没有空符号标记 3) 有穷自动机状态转换图开始状态有引入,终止状态有引出(3)有穷自动机状态转换图与转换系统的关系定理:对于任何一个有穷自动机状态转换图存在一个相应转换系统。,27,由状态图构造转换系统方法如下: 设状态图具有,n的开始状态,,m的终态 。 1) 首先,我们增加一个新状态作为转换系统唯一开始状态,并增加n条标记为,分别引到,n的弧。 2) 然后再增加一个新状态作为转换系统最终状态,并增加m条标记为的弧自,m引到。,28,对于任
20、一个状态图,我们可以构造一个相应的转换系统,使它们接受相同 的符号串集合。如图上图(a)是有穷自动机状态图,上图(b)是等价的转换系统。,从该转换系统可以看出它符合定义的三个条件:开始状态没有引入; 终止状态没有引出;可以用标记。显然,上图(b)与上图(a) 是等价的,因为上图(b)只比上图(a)增加了n条弧,不影响接受 的句子。,S1,S2,X,S1,S2,X,S,图(a),图(b),29,(4)由正规表达式e构造转换系统 定理:对于每一个正规式e,存在一个接受正规集L(e)的转换系统。 设和是转换系统的开始状态和最终状态,构造字母表 a1,a2,,an上正规表达式转换系统方法下图所示。,S
21、,正规式 转换系统,S,S,ai,ai,S,e,e,S,e1,e1|e2,S,e1e2,e2,e1,e2,S,e*,e,30,例3.9 设字母表a,b,在上正规式eaabb,试构造转换系统。 利用上图构造转换系统方法,其相应转换系统如下图所示。,S,aabb,S,aa,bb,S,1,2,a,a,b,b,31,例在上正规式e=(a)*, 其相应转换系统如下图所示。,S,5,a,L(e)L( (a)*)a *,a,aa,aaa,32,例3.10 设a,b,在上正规式e=(ab)*(aabb)(ab)*, 试构造转换系统。其相应转换系统如下图所示。,由正规表达式构造出转换系统,实际上就是一个带空转换
22、的,我们可以消去 空转换而成为一个不带空转换,再利用前面所学的方法将变成。 下面我们介绍另外一种方法,可以直接由转换系统来构造确定有穷自动机。,S,(ab)*(aabb)(ab)*,S,1,2,(ab)*,(ab)*,(aabb),S,5,6,1,2,aa,bb,ab,ab,S,5,6,1,2,b,b,3,4,a,b,a,b,a,a,33,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有
23、穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,34,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,35,3.6正规表达式和有穷自动机四、由正规表达式构造确定有穷自动机2.由转换系统构造确定有
24、穷自动机(子集法) 先介绍两个重要的定义(1)状态子集I的闭包 1)子集I的闭包 假定I是转换图状态集K一个子集,定义-CLOSURE(I)为 若SiI,则Si-CLOSURE(I); 若SiI,则Si出发经过一条或多条相邻的弧能到达K中任何状态Sj,则Sj-CLOSURE(I)。-CLOSURE(I)称为I的闭包。它是状态集K的一个子集。 ,36,1,5,4,a,a,b,设有转换系统如下图所示:,2,3,a,6,7,37,显然,状态集, 设,求CLOSURE(), 即 求CLOSURE(1) 因为 1I 所以1CLOSURE(I); 又因为从1出发经过一个到达2,所以2CLOSURE(I)
25、所以CLOSURE(I)=1,2。 若令I=4,5,求CLOSURE(I) 由4,5I得4,5CLOSURE(I) 由4出发经过一个到达7,经过两个到达8,所以 7,8CLOSURE(I);同样从5出发经过可到达6,2,得 6,2CLOSURE(I) 所以CLOSURE(I)=2,4,5,6,7,8,38,2)子集Ia若I是转换系统状态集K一个子集,a,定义Ia=-CLOSURE(J)其中:J是所有那些可从子集I中任一状态出发,经过一条a弧(跳过a弧前的弧)而到达状态的全体。 ,设,求Ia=-CLOSURE(J) 由图知,从1出发经过a弧或经过若干弧和一个a弧可到达5,4,3,所以 J=5,4
26、,3,有前面求I的闭包的方法,可得Ia =CLOSURE(J)= CLOSURE(5,4,3)=5,4,3,6,2,8,7,实际上可以直接由I求Ia(省掉求J的中间过程),即Ia是I中状态经历一条 a弧(跳过a弧前面和后面的若干弧)到达的状态集合。 从1出发经过a弧或跳过a弧前面和后面的若干弧可到达5,6,2,3,8,4,7,39,下面介绍如何用子集法构造确定有穷自动机,由所学知识可知,一个正规式可以构造出一个转换系统,它实际上描述了一个 含空()转换的非确定有限自动机(记为-NFA),子集法构造DFA即对该 -NFA进行确定化。,40,(2) 由转换系统构造确定有穷自动机子集法 1)子集法由
27、转换系统构造确定有穷自动机实例 设有正规式e为(a|b)*(aa|bb)(a|b)* 试构造一个确定有穷自动机(),使得 ()(e),已知此正规式的转换系统如下图。它的状态集S,1,2,3,4,5,6,Z,其中为初始状态,为终止状态 . =a,b.所以 构造一张表,共3列,分别为I,Ia,Ib; 求CLOSURE(S), CLOSURE(S)=S,5,1,将S,5,1填到表格的第一行第一列; 令I=S,5,1,求Ia,Ib(分别为5,3,1和5,4,1)并填入表格的第一行Ia、Ib列;,S,5,6,1,2,b,b,3,4,a,b,a,b,a,a,41,检查上一步Ia,Ib两个子集是否在I列中出
28、现,将未出现的Ia或Ib作为 表格第二或第三行I列的值,类似步骤(3)求第二行的Ia,Ib的值。再检查,再求第三行的Ia,Ib的值。直到所有I的Ia,Ib都已求,并且没有新的状态子集加入第一列为止。(参见下表),I Ia IbS,5,1 5,3,1 5,4,15,3,1 5,3,1,2,6,Z 5,4,15,4,1 5,3,1 5,4,1,2,6,Z 5,3,1,2,6,Z 5,3,1,2,6,Z 5,4,1,6,Z5,4,1,2,6,Z 5,3,1,6,Z 5,4,1,2,6,Z5,4,1,6,Z 5,3,1,6,Z 5,4,1,2,6,Z 5,3,1,6,Z 5,3,1,2,6,Z 5,4
29、,1,6,Z,42,将I中各子集DFA中一状态并给予重命名。(参见下表),字符 a b 状态0 1 21 3 22 1 53 3 44 6 55 6 56 3 4,43, 确定DFA的初态为重命名后的状态0(重命名前为S,5,1含原初态S),终态为3,4,5,6(它们在重命名前都含原终态Z) 下图是的状态转换图,0,1,2,a,b,a,b,a,a,a,a,a,b,b,b,b,44,2)子集法由转换系统构造确定有穷自动机步骤 构造一张表,它共有列,第一列为状态子集,然后对每个a分别设一列Ia; 第一行第一列的状态子集为CLOSURE(S)。其为初始状态; 为第一列中的和每个a,求Ia,并记入相应
30、Ia列,如果它不同于第一列中已有状态子集,则将它列入第一列中; 重复,直到对每个及a均已求得Ia,并且没有新的状态子集加入第一列时为止; 上述过程在有限步后必可终止,因为状态子集个数是有限的。 将第一列中每个状态子集作为一个新状态,并重新命名,把每个Ia看作是相应输入符号,把其余的状态子集随第一列中的状态子集做相应的重命名,作为状态转换函数值,这样一个表就是相应的确定有穷自动机的状态转换矩阵。含有初始状态的状态子集命名的状态是新初始状态,含有终止状态的状态子集命名的状态是新终止状态。,45,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定
31、义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,46,根据正规表达式可以方便地构造DFA,那么,对于一个给定的正规文法如何来构造一个正规表达式呢?下面就来讨论这个问题。,(1)由右线性文法构造正规表达式例:已知正规文法(右线性文法):aSaBbCaCa 1)写成正规表达式方程组,用“+”代替“|”,用“=”代替“”aSaB (1)bC (2)aCa (3),3.6正规表
32、达式和有穷自动机四、由正规表达式构造确定有穷自动机3. 由正规文法构造正规表达式,47,2) 求解形如X=aX+b的方程,其中a,b是终结符,即是字母表上的正规表达式,是文法非终结符(变量)。X=a*b 是方程的解 将它代入方程两端就可以验证这一点: a*b=aa*b+b右端提公因子,得 a*b=(aa*+)b 注意到aa*a*(都表示,a,aa,),就有a*b=a*b,所以 a*b是方程的一个解。 3)为了求出文法开始符号的解,我们先解方程(),类似于X=aX+b 的解X= a*b, C=aC+a的解为C=a*a(4) 4)将(4)代入(2),得B=ba*a (5) 5)将(5)代入(1),
33、得S=aS+aba*a,显然S=a*aba*a (即文法所对应的正规式), 正规式对应的正规集是amaban m 0,n1,48,如果给定文法是一个左线性文法,我们就求解形如 X=Xa+b的方程X=ba*是它的一个解,例如,标识符字母字母数字 其方程为 字母数字字母(字母数字)字母 所以字母(字母数字)* 即:由文法所产生语言可用正规式字母(字母|数字)* 来表示。,(2)由左线性文法构造正规表达式,49,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确
34、定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,50,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,51,3.6正规表达式和
35、有穷自动机五、确定有穷自动机的化简,所谓确定有穷自动机()的化简是指:寻找一个状态数比少的确定有穷自动机()使得()()。,52,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,53,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.
36、非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,54,1. 等价和可区分的概念等价:对于一个给定的(DFA)M,假定有两个不相同状态和,如果从状态出发能扫描符号串w而停止于终态,同样,从状态出发也能扫描符号串w而停止于终态,反之亦然,我们则称状态和是等价的 。,如下图所示,状态3,4是等价的,因为从3出发读入b,a到达终态,同时从4出发读入b,a也能
37、到达终态。,0,1,2,a,b,a,b,a,a,a,a,a,b,b,b,b,3.6正规表达式和有穷自动机五、确定有穷自动机的化简,b,55,注意:终态和非终态是可区分的。 (因为终态可以读回到终态而非终态读入则不能回到终态),可区分: 若两不同状态不等价,则称它们是可区分的。 如图中状态1,2就是可区分的。因为从1出发读入a到达终态,而从2出发读入a则只能到达非终态。,56,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构
38、造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,57,第三章 词 法 分 析,3.6正规表达式和有穷自动机一、正规表达式和正规集的定义1.非形式定义2.递归定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机的关系四、由正规表达式构造确定有穷自动机1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机(子集法)3.由正规文法构造正规表达式五、确定有穷自动机的化简1.等价和可区分的概念2.确定有穷自动机的化简方法,58,3.6正规表达式和有穷自动机五、确定有穷自动机的化
39、简 2. 确定有穷自动机的化简方法基本思想:把(DFA)的状态集分别划成一些不相交子集,使得任何不 同的两个子集的状态是可区分的,而同一子集中的任何两个状态是等价的。 最后,从每个子集选出一个状态以代表该子集,同时消去其它等价状态 。如:上例 先将K=0,1,2,3,4,5,6划分成两组:终态集3,4,5,6和非终态集0,1,2 由状态图可知3,4,5,6a=3,6均为终态,3,4,5,6b=4,5也均为终态,所以3,4,5,6是不可分的,即等价。 考察0,1,2a,因为aa(非终态),a(终态),故0,1,2可区分为0,2,。 再考察0,2b,因为b2 (非终态) ,2b5(终态) ,故0,
40、2可区分为0,2。,59,因此0,1,2三个状态是可区分的。因为3,4,5,6中各状态 等价,取任一状态如3为代表,将原来到达状态4,5,6的弧都导入3, 同时删除4,5,6即的简化的DFA。(其状态转换图如下所示 ),60,第三章 词 法 分 析,3.1 引言一、词法分析基本思想二、词法分析任务三、词法分析方式四、词法分析方法 3.2 单词的内部编码一、单词二、内部编码 3.3 正规文法和状态转换图一、正规文法二、状态转换图三、正规文法与状态转换图 3.4 词法分析程序设计与实现一、源程序的输入二、缓冲区及预处理三、超前搜索四、由词法语法规则画状态转换图五、词法分析程序的设计与实现,3.5
41、正规文法和有穷自动机一、用正规文法描述单词二、由正规文法构造状态转换图三、有穷自动机FA四、有穷自动机和正规文法的关系五、DFA与NFA的关系 3.6 正规表达式和有穷自动机一、正规表达式和正规集的定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机四、由正规表达式构造确定有穷自动机五、确定有穷自动机的化简 3.7 词法分析程序的自动生成一、问题的提出二、语言LEX一般描述三、LEX编译程序的实现四、LEX目标程序,61,第三章 词 法 分 析,3.1 引言一、词法分析基本思想二、词法分析任务三、词法分析方式四、词法分析方法 3.2 单词的内部编码一、单词二、内部编码 3.3 正规文法
42、和状态转换图一、正规文法二、状态转换图三、正规文法与状态转换图 3.4 词法分析程序设计与实现一、源程序的输入二、缓冲区及预处理三、超前搜索四、由词法语法规则画状态转换图五、词法分析程序的设计与实现,3.5 正规文法和有穷自动机一、用正规文法描述单词二、由正规文法构造状态转换图三、有穷自动机FA四、有穷自动机和正规文法的关系五、DFA与NFA的关系 3.6 正规表达式和有穷自动机一、正规表达式和正规集的定义二、正规表达式的性质三、正规文法、正规表达式与有穷自动机四、由正规表达式构造确定有穷自动机五、确定有穷自动机的化简 3.7 词法分析程序的自动生成一、问题的提出二、语言LEX一般描述三、LE
43、X编译程序的实现四、LEX目标程序,62,第三章 词 法 分 析,3.7词法分析程序的自动生成一、问题的提出二、语言LEX一般描述.辅助定义段.识别规则三、LEX编译程序的实现四、LEX目标程序,63,第三章 词 法 分 析,3.7词法分析程序的自动生成一、问题的提出二、语言LEX一般描述.辅助定义段.识别规则三、LEX编译程序的实现四、LEX目标程序,64,3.7词法分析程序的自动生成,一、问题提出各种不同高级程序设计语言中单词的基本结构是相似的,是否可以设计一个词法分析程序生成器,只要给出有关语言的单词描述,就可以生成相应的词法分析程序呢?因为正规文法可以转换成正规式,正规式可以转换成一个
44、DFA,而DFA又可以直接用来识别单词,因此该问题是可以解决的。下面就来介绍一种以正规式作为输入的词法分析程序生成器LEX。 功能图如下:LEX LEX 词法分析源程序 编译程序 程序L输入串 词法分析程序L 单词符号串,用LEX语言描述词法规则的程序,词法分析生成器就是对LEX源程序进行编译,词法分析器就是进行词法分析(单词识别处理)的程序,65,第三章 词 法 分 析,3.7词法分析程序的自动生成一、问题的提出二、语言LEX一般描述.辅助定义段.识别规则三、LEX编译程序的实现四、LEX目标程序,66,3.7词法分析程序的自动生成二、LEX语言的一般描述 一个源程序是一个词法分析程序规范说
45、明书,主要由两部分组成, 即辅助定义式部分和识别规则部分。这两部分都由语句组成, 其格式如下:AUXILIARY DEFINITIONS 各辅助定义语句RECOGNITION RULES各识别规则语句,67,第三章 词 法 分 析,3.7词法分析程序的自动生成一、问题的提出二、语言LEX一般描述.辅助定义段 .识别规则三、LEX编译程序的实现四、LEX目标程序,68,3.7词法分析程序的自动生成二、LEX语言的一般描述.辅助定义段 辅助定义式是由以下形式的语句组成 nn 其中每一个i是正则表达式,i是代表这个正则表达式的简名 。 规定:在i中只能出现字母中的字符和前面已定义的简名D1, D2,,Di-1,而不能出现未定义的简名,如i,i+1,n。 如:用辅助定义段来定义标识符这类单词=A,B,Z,0,1,2,9 则定义如下: letter digit identifierletter(letterdigit)*,