西安电子科技大学编译原理 (2)_第1页
西安电子科技大学编译原理 (2)_第2页
西安电子科技大学编译原理 (2)_第3页
西安电子科技大学编译原理 (2)_第4页
西安电子科技大学编译原理 (2)_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1上次课内容回顾FNFA FDFAF等价性22.4 从正规式到词法分析器构造词法分析器的一般方法和步骤:1. 描述:用正规式对模式进行描述;2. 构造NFA:为每个正规式构造一个NFA;3. 确定化:将NFA转换成等价的DFA;4. 最小化:优化DFA,使其状态数最少;5. 构造词法分析器:由DFA构造词法分析器。32.4 从正规式到词法分析器F从正规式到NFA 算法2.2 Thompson 算法输入字母表上的正规式 r输出接受 L(r) 的NFA N方法首先分解 r,然后根据下述步骤构造NFA:1. 对,构造NFA N() 接受; 2. 对上的每个字符a,构造NFA N(a) 接受a;3.

2、若N(p)和N(q)是正规式p和q的NFA,则ar|srsr*(r)42.4 从正规式到词法分析器(a)对正规式p|q,构造NFA N(p|q) 接受L(p)L(q);(b)对正规式pq,构造NFA N(pq) 接受L(p)L(q); (c)对正规式p*,构造NFA N(p*) 接受L(p*); (d)对于正规式(p),使用p本身的NFA,不再构造。ar|srsr*(r)52.4 从正规式到词法分析器例2.11 用Thompson算法构造正规式r = (a | b)* a b b的NFA N(r) 。先分解正规式,再自下而上构造NFA注意:算法的构造与正规式一一对应构造一个新的NFA最多增加两

3、个状态62.4 从正规式到词法分析器F从NFA到DFA1. NFA识别记号的“并行”方法例2.12 从甲地到乙地,可以乘汽车也可以骑自行车,具体路线如右图。其中c表示乘车,b表示骑自行车。现在要求从甲地到乙地,只许乘车而不许骑自行车,该如何走?抽象:识别是否有从甲到乙标记为全c的路径串行(试探):甲 c 2 无路可走,退回甲 c 1 c 3 无路可走,退回甲 c 1 c 乙 到达乙地,成功 并行:有多辆汽车,每次到达汽车能到达的全体甲 c 1, 2c 3, 乙到达乙地,成功72.4 从正规式到词法分析器由于并行的方法在每试探一步时,考虑了所有的下一状态转移(所有下一状态作为一个状态集合),因此

4、所走的每一步都是确定的。用NFA识别记号,并不采用串行的方法(算法不易构造,复杂度高且回溯),而是采用并行的方法,核心思想是将不确定的下一状态确定化。NFA上识别记号的确定化方法是在计算下一状态转移时,实施如下确定化的两个步骤:1. 消除 状态转移:-闭包(T) 2. 消除多于一个的下一状态转移:smove(S, a)82.4 从正规式到词法分析器-闭包(T):从状态集T出发,不经任何字符达到的状态全体。定义2.6 状态集T的-闭包(T)是一个状态集,且满足:(1)T中所有状态属于-闭包(T);(2)任何smove(-闭包(T),)属于-闭包(T);(3)再无其他状态属于-闭包(T)。 根据定

5、义,-闭包(s2)应包括:1. s2自身s2(1)2. s4s2, s4(2)3. s5s2, s4, s5 (2)92.4 从正规式到词法分析器算法2.4 求-闭包输入状态集T输出状态集T的-闭包(U)方法for T中每个状态t将t加入U; push(t); end for;while 栈不空pop(t); for 每个u = move(t, )if u不在U中 then 将u加入U; push(u); end if; end for;end while; return U;集合U和模拟递归的stack102.4 从正规式到词法分析器-闭包(s1,s2)U= 112.4 从正规式到词法分析器

6、-闭包(s1,s2)U=s1,s2 s1s2122.4 从正规式到词法分析器-闭包(s1,s2)U=s1,s2 s1Move(s2,)=s4132.4 从正规式到词法分析器-闭包(s1,s2)U=s1,s2 s1Move(s2,)=s4U=s1,s2,s4s4142.4 从正规式到词法分析器-闭包(s1,s2)U=s1,s2 s1Move(s4,)=s5U=s1,s2,s4152.4 从正规式到词法分析器-闭包(s1,s2)U=s1,s2 s1Move(s4,)=s5U=s1,s2,s4U=s1,s2,s4,s5s5162.4 从正规式到词法分析器-闭包(s1,s2)U=s1,s2 s1Mov

7、e(s5,)= U=s1,s2,s4U=s1,s2,s4,s5172.4 从正规式到词法分析器-闭包(s1,s2)U=s1,s2 U=s1,s2,s4U=s1,s2,s4,s5Move(s1,)= 182.4 从正规式到词法分析器-闭包(s1,s2)U=s1,s2 Move(s1,)= U=s1,s2,s4U=s1,s2,s4,s5192.4 从正规式到词法分析器Fsmove(S, a):从状态集S出发,标记为a的下一状态全体。与move(s, a)的唯一区别:用状态集取代状态。1234aabasmove(1,3, a)=5,4,25a202.4 从正规式到词法分析器算法2.3 模拟NFA(并

8、行)输入NFA N,x(eof),s0,F 输出若N接受x,回答“yes”,否则“no” 方法用下边的过程对x进行识别。S是一个状态的集合 S := -闭包(s0);- 所有可能初态的集合a := nextchar;while a eof loop S := -闭包(smove(S,a); - 所有下一状态的集合a := nextchar;end loop;if SF then return “yes”; else return “no”; end if; 模拟模拟DFA模拟模拟NFA开始开始初态初态(s0)初态的初态的s0的的-闭包闭包下一状下一状态转移态转移当前状态的当前状态的下一状态下一

9、状态当前状态集当前状态集的的下一状态集下一状态集结束结束s 是否在是否在 F中中SF212.4 从正规式到词法分析器识别abb: 计算初态集:-闭包(0)= 0,1,2,4,7 A从A出发经a到达:-闭包(smove(A, a)= 3,8,6,7,1,2,4 B从B出发经b到达:-闭包(smove(B, b)= 9,5, 6,7,1,2,4 C从C出发经b到达:-闭包(smove(C, b)= 10,5,6,7,1,2,4 D结束且D10=10,可以识别abb。识别的路径为:A a B b C b D例2.13 在NFA上识别输入序列abb和abab222.4 从正规式到词法分析器识别abab

10、: 初态集:-闭包(s0)=0,1,2,4,7 A从A出发经a到达:-闭包(smove(A, a) = 3,8,6,7,1,2,4 B从B出发经b到达:-闭包(smove(B, b) = 9,5, 6,7,1,2,4 C从C出发经a到达:-闭包(smove(C, a) = 8,3, 6,7,1,2,4 B从B出发经b到达:-闭包(smove(B, b) = 9,5, 6,7,1,2,4 C识别路径为:A a B b C a B b C。由于C10=,所以不能识别例2.13 在NFA上识别输入序列abb和abab232.4 从正规式到词法分析器2. 子集法构造DFA并行模拟NFA的弱点:每次动态

11、计算下一状态转移的集合,效率低。改进方法:将NFA上的全部路径均确定化并且记录下来,得到与NFA等价的DFA。 从甲地到乙地的路径是一个NFA ,可找到一个等价的DFA。例例2.14 用用DFA识别识别cc和和cbc:甲甲 c 1,2 c 3,乙乙, 接受接受 甲甲 c 1,2 b 3 c ?,不接受,不接受 1. 消除了不确定性2. 无需动态计算状态集合24算法2.5 从NFA构造DFA(子集法)输入 NFA N输出等价的DFA D,其初态含有NFA初态,终态是含有NFA终态的状态集合。方法用下述过程构造DFADstates = -闭包(s0) ;-是唯一状态且未标记while Dstate

12、s有未标记状态集T loop 标记T; for 每一个字符a loopU := -闭包(smove(T,a);if U非空 thenDtranT,a := U; if U不在Dstates中 then U作为未标记状态加入Dstates;end if;end if; end for; end while; return:Dstates和转换矩阵Dtran状态集的集合状态集的集合Dstates和转换矩阵和转换矩阵Dtran25-闭包(0)=0,1,2,4,7*A-闭包(smove(A, a)=3,8,6,7,1,2,4*B-闭包(smove(A, b)=5,6,7,1,2,4*C-闭包(smov

13、e(B, a)=3,8,6,7,1,2,4B-闭包(smove(B, b)=5,9,6,7,1,2,4*D-闭包(smove(C, a)=3,8,6,7,1,2,4B-闭包(smove(C, b)=5,6,7,1,2,4C-闭包(smove(D, a)=3,8,6,7,1,2,4B-闭包(smove(D, b)=5,10,6,7,1,2,4*E-闭包(smove(E, a)=3,8,6,7,1,2,4B-闭包(smove(E, b)=5,6,7,1,2,4C例2.15 用算法2.5构造(a|b)*abb的DFA 选择哪一个选择哪一个DFA?262.4 从正规式到词法分析器3. 最小化DFA对于

14、若干个等价的DFA,总是希望由状态数最小的DFA构造词法分析器。将一个DFA等价变换为另一个状态数最小的DFA的过程被称为最小化DFA。定义2.7 对于任何两个状态t和s,若从一状态出发接受输入字符串,而从另一状态出发不接受,或者从t出发和从s出发到达不同的接受状态,则称对状态t和s是可区分的。设想任何输入序列对s和t均是不可区分的,则说明从s出发和从t出发,分析任何输入序列均得到相同结果。因此,s和t可以合并成一个状态。 最小化DFA的实质:在状态集S上不可区分的状态合并成一个状态。272.4 从正规式到词法分析器算法2.6 最小化DFA的状态数输入DFA D=S,move,s0,F。输出等

15、价的D=S,move,s0,F(D状态数最少)方法执行如下步骤:1. 初始划分=S-F,F1,F2,.,其中,Fi是F的子集,接受不同记号;2. 应用下述过程构造新的划分new:for 的每一个组G划分G,G的两个状态s和t在同一组中的充要条件是:a.(move(s,a)Gimove(t,a)Gi);用新划分的组替代G,形成新的划分new; end for;3.若 new= 则final:=且转4; 否则=:new且转2;282.4 从正规式到词法分析器4. 在final每个组Gi中选一个代表si,使得D中从Gi所有状态出发的状态转移在D中均从si出发,D中所有转向Gi中的状态转移在D中均转向

16、si。 含有D中s0的状态组G0的代表s0称为D的初态,D中所有含F中状态的Gj的代表sj构成D的终态集F; 5. 删除死状态,即不是终态且对所有输入字符均转向其自身,或从初态不可到达的状态。最小化DFA算法的主要步骤1. 初始划分:终态与非终态;2. 利用可区分的概念,反复分裂划分中的组Gi,直到不可再分裂;3. 由最终划分构造D,关键是选代表和修改状态转移;4. 消除可能的死状态和不可达状态。292.4 从正规式到词法分析器例2.17 用算法2.6化简DFA1初始化划分1=ABCD,E2反复分裂划分中的组: m(D, b)=E 2=ABC,D,E m(B, b)=D 3=AC,B,D,E 3? 于是:final=AC,B,D,E 4根据final构造D: 选代表,用A代表AC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论