NFA的確定化


NFA的確定化
該方法稱為子集法:   

按字符將起始狀態集到達狀態集抽象為狀態,從而等價地化為單值映射, ε弧按照語義被吸收,由 ε-closure 運算去除
首先定義 ε-closure 運算:   

  設 I 是狀態集的一個子集,則 I 的 ε-閉包 ε-closure(I) 為    

  •   若狀態s∈I,則s∈ε-closure(I)    
  •   若狀態s∈I,則從s出發經過任意條 ε弧可以到達的任何狀態s’,都屬於ε-closure(I)

再定義Ia運算:   

  設a為Σ中的一個字符,定義Ia=ε-closure(J),其中,

  J為I中的某個狀態出發經過一條a弧而到達的狀態集合,Ia即是為這樣的集合作ε-閉包

以下圖的NFA為例,說明ε-閉包及Ia運算

 

 

 

ε-closure({1}) = {1,2}
記 I = {1,2},則 Ia= ε-closure({5,4,3}) = {5,4,3,6,2,7,8}

在下圖NFA中使用子集法進行確定化

 

 

 如下表,表頭為參與計算的狀態集 I,各字符的運算結果 Ii,其中i∈Σ
每個計算出的狀態集再進行 Ii 的運算、
因為Σ為有限集,所以這張表也是有限的

 

 

 

這張表實際上就是狀態集 I 接收字符 i 后到達狀態集 Ii,描述了狀態集間的單值映射

將每個狀態集視為新的狀態,該表即為一個狀態轉換矩陣
這個狀態轉換矩陣就是一個新的FA,而且是一個DFA
其中含有原先初態X的狀態集為新的初態,含有原來任何一個終態的狀態集都是新的終態

 

 

 

 

 

 

不難看出,這就是識別含有aa或bb的字的DFA

那么,現在的詞法分析的理論已經是下面醬紫了

 

 

 小結:程序設計語言的單詞集合是一個正規集,可以由正規式描述,正規式與正規集是一組對應的概念;FA分為DFA和NFA,NFA易於人工設計,DFA易於詞法分析的程序實現,從定義上來看,DFA是NFA的特例,而NFA與DFA的描述是相同的,並且NFA可以等價地轉換為DFA

DFA的化簡即是狀態集按等價類的划分

  • 使任何兩個不同的子集中的狀態是可區分的,而同一狀態中的任意狀態間是等價的
  • 任何兩個子集均不相交
  • 最后每個子集保留一個狀態

 

 

 

 

I = {0,1,2,3,4,5,6},其中終態為{3,4,5,6}
∴初始划分為 I(1) = {3,4,5,6},I(2) = {0,1,2}
等待划分的子集有 I(1)、I(2),Π = {I(1),I(2)}
檢查 I(1) 是否可以按字符 a 或 b 進行划分,Ia(1)包含於 I(1) ,Ib(1)也包含於 I(1) , 即 I(1) 中各狀態是等價的,無須划分
等待划分的子集有 I(2),Π = {I(1),I(2)}
檢查 I(2) 是否可以按字符 a 進行划分,Ia(2) = {1,3},分別落在I(1)和I(2)中, 因此將 I(2) 划分為 I(21) = {0,2},I(22) = {1}
等待划分的子集有 I(21)、I(22),Π = {I(1),I(21), I(22)}
檢查 I(21) 是否可以按字符 a 划分,(其實已經檢查過了 ), Ia(21) 包含於 I(22), 檢查 I(21) 是否可以按字符 b 划分,Ib(2) = {2,4},分別落在 I(21) 和 I(1) 中, 因此將 I(21) 划分為 I(211) = {0}, I(212) = {2}
等待划分的子集有 I(22)、I(211)、I(212),Π = {I(1),I(22),I(211),I(212)}
I(22)大小為1,無須繼續划分 I(211)大小為1,無須繼續划分 I(212)大小為1,無須繼續划分
划分完畢,Π = {I(1),I(22),I(211),I(212)} I(1) = {3,4,5,6},I(22) = {1},I(211) = {0},I(212) = {2}
則保留狀態 0、1、2、3,其中0為初態,3為終態 按照轉換關系,得到化簡結果如下 

 

 


原文鏈接:https://blog.csdn.net/kafmws/article/details/96595750


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM