以下代码来自 华保健老师讲授的编译原理,部分算法帮助理解解题过程
请一步步看例题的解析
如若 例题看不下去或者不理解其中部分的解题步骤,可以看这位老师的课程
若有问题,希望反馈,共同学习
文章目录
词法分析器
子集构造算法
eps_closure()算法 (深度优先)
set closure = {}
void eps_closure (q)
closure += {q} // + 相当于集合的 ∪
foreach (y : q --ε-- > y)
if(!visited (y))
eps_closure(y)
此算法就是 q 经过 ε 得到 y 一直遍历的过程
子集构造算法
q0 <- eps_closure(n0)
Q <- {q0}
workList <- q0
while (workList != [])
remove q from workList
foreach (character c)
t <- eps_closure (delta (q,c))
D[q,c] <- t // 转换后的t放在 DFA中
if(t not in Q)
add t to Q and workList
例 题:
解题过程 :
q0 = eps_closure( 0 ) // eps_closure( 0 ) 包括 0 本身
= {0, 1, 2, 4, 7}
Q <- {q0}
remove q0 from workList;
q1 = eps_closure(delta(q0,'a')) // delta(q0,'a') = 3 的过程为 2 --(a)-- 3
= t1 + t2
= eps_closure( 3 ) + eps_closure( 8 )
= {1,2,3,4,6,7} U {8}
= {1,2,3,4,6,7,8}
add q1 to Q and workList
q2 = eps_closure(delta(q0,'b')) // delta(q0,'b') = 5 的过程为 4 --(b)-- 5
= t1
= eps_closure( 5 )
= {1,2,4,5,6,7}
add q2 to Q and workList
remove q1 from workList
eps_closure(delta(q1,'a')) = eps_closure(3) + eps_closure(8)// 在 Q 中,与q1相同 not add
q3 = eps_closure(delta(q1,'b'))
= t1 + t2
= eps_closure( 5 ) + eps_closure( 9 )
= {1,2,4,5,6,7} U {9}
= {1,2,4,5,6,7,9}
add q3 to Q and workList
remove q2 from workList
eps_closure(delta(q2,'a')) // 在 Q中,与q1相同,not add Q and workList
eps_closure(deleta(q2,'b')) // // 在 Q中,与q2相同,not add Q and workList
remove q3 from workList
eps_closure(delta(q3,'a')) // 在 Q中,与q1相同,not add Q and workList
q4 = eps_closure(delta(q3,'b'))
= t1 + t2
= eps_closure( 5 ) + eps_closure( 10 )
= {1,2,4,5,6,7} U {10}
= {1,2,4,5,6,7,10}
add q4 to Q and workList
remove q4 from workList
eps_closure(delta(q4,'a')) // 在 Q中,与q1相同,not add Q and workList
eps_closure(deleta(q4,'b')) // // 在 Q中,与q2相同,not add Q and workList
workList == []
退出
Q = {q0,q1,q2,q3,q4} --> 形成DFA
DFA 转换表:
DFA | a | b |
---|---|---|
q0 | q1 | q2 |
q1 | q1 | q3 |
q2 | q1 | q2 |
q3 | q1 | q4 |
q4 | q1 | q2 |
第一行 :
q1 = eps_closure(delta(q0,‘a’)) ········· > q0 --( a )-- q1
q2 = eps_closure(delta(q0,‘b’)) ··········> q0 --( a )-- q2以下四行同理