南开大学编译原理第三章.ppt

语法树表示正规式(续) start A B 1 C D 2 E 3 4 5 F e e e e e e e e a a b b b 6 # (a|b)*abb#对应的NFA 3.9.2 正规式直接转换为DFA 扩充正规式(r)#,构造语法树T nullable, firstpos, lastpos, followpos 函数nullable, firstpos, lastpos定义在T的结点上 followpos函数定义在position集上,其计算依赖上面三个函数 最后,利用followpos构造DFA followpos 符号只在标有该符号的position处匹配 position的相邻关系,e-closure(d(…)) followpos——表示位置间的相邻关系 i:一个position followpos(i):一个position集合,其中的每个position j满足: 存在一个输入串…cd… c在i处匹配,d在j处匹配(i,j相邻) j跟随(follow)i 例3.21 (a|b)*abb#:followpos(1)={1, 2, 3} B 1 C D 2 E 3 e e e e e e a b 1 1 2 2 1 3 4 5 a a b b a a b b followpos的计算 对子正规式,其首尾符号的对应位置之间存在跟随关系 rs,s的首位置跟随r的尾位置 r*,r的首位置跟随其尾位置 firstpos(n):对以n为根的子正规式,可匹配其首符号的位置的集合 lastpos(n):可匹配尾符号的位置的集合 前例: firstpos(n) = {1, 2, 3}, lastpos(n) = {6} nullable(n):可匹配空串 计算firstpos, lastpos, nullable 结点n firstpos(n) n是标记为e的叶结点 n是标记为 位置i的叶结点 nullable(n) true false ? {i} nullable(c1) or nullable(c2) firstpos(c1) ∪ firstpos(c2) 计算firstpos, lastpos, nullable 结点n firstpos(n) nullable(n) true nullable(c1) and nullable(c2) if nullable(c1) then firstpos(c1) ∪ firstpos(c2) else firstpos(c1) firstpos(c1) 计算followpos lastpos计算同firstpos,c1、c2交换即可 followpos的计算 n——·结点,左孩子c1,右孩子c2, i∈lastpos(c1),c1的尾位置? 对所有j∈firstpos(c2) ,j∈followpos(i) n——*结点, i∈lastpos(n),n的尾位置? 对所有j∈firstpos(n) , j∈followpos(i) 例3.22 位置 1 2 3 4 5 6 followpos {1,2,3} {1,2,3} {4} {5} {6} - 例3.22(续) 有向图 位置——状态,j∈followpos(i)——边i?j a a b b a a b b b 例3.22(续) 看作NFA firstpos(root)中的位置均为初态 边(i, j)标记为位置i的符号 #对应位置为唯一终态 a a b b a a b b b 算法3.5 正规式直接构造DFA 输入:一个正规式r 输出:一个DFA D,L(D)=L(r) 方法: 构造扩充正规式(r)#对应的语法树T 深度优先搜索T,计算函数nullable, firstpos, lastpos和followpos 构造D的状态集Dstates和状态转换表Dtran,算法如下所示。状态——位置集,firstpos(root) 为初态,#对应位置为终态。 算法3.5 (续) 构造Dstates和Dtrans算法 初始,Dstates中唯一状态为firstpos(root),设为未标记,其中root为(r)#对应语法树的根; while (Dstates中有未标记状态T) { 标记T; for (每个符号a) { U=∪followpos(p) (p∈T, 且位置p处符号为a); if (U不空且不在Dstates中) { 将U加入Dstates,设为未标记; } Dtran[T, a] = U; } } 例3.23 A=firstpos(root)={1, 2, 3} Dtrans[A, a]=followpos(1)∪followpos(3)={1,2,3,4}=B Dtrans[A, b

文档评论(0)

1亿VIP精品文档

相关文档