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)  ) ,然後就沒然後了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章