NFA转换为DFA过程,适合解题,不适用理解其中的底层算法原理

以下代码来自 华保健老师讲授的编译原理,部分算法帮助理解解题过程
请一步步看例题的解析
如若 例题看不下去或者不理解其中部分的解题步骤,可以看这位老师的课程
若有问题,希望反馈,共同学习

词法分析器

在这里插入图片描述

子集构造算法

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

以下四行同理

结果图 :

在这里插入图片描述

跟着解题过程练习,熟悉大致过程,脑海中形成看到状态X,想到 delta (X,a) ,eps_closure( delta (X,a)  ) ,然后就没然后了

发布了41 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42259578/article/details/103003452
今日推荐