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 转换表:
DFAab
q0q1q2
q1q1q3
q2q1q2
q3q1q4
q4q1q2

第一行 :
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)  ) ,然后就没然后了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值