日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

词法分析(4)---NFA与DFA的转化

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 词法分析(4)---NFA与DFA的转化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 子集構造(Subset Construction)

  這是一個轉換NFA到DFA的算法。我們知道NFA和DFA的區別最主要的就是一個狀態和一個input symbol是否能夠確定一個狀態的問題,對于NFA,它將確定一個組狀態,而DFA將確定一個狀態,因此,我們有一個很好的辦法就是把NFA的狀態集對應每個DFA的狀態,這就是subset construction的思想,不過這只是大概泛泛而論,我們需要更加明確的認識

  1) NFA在任何一個input symbol下,映射的狀態集(通過move函數,這個集合通常用T字母表示)應該被知道

  2) 必須保證1)中狀態集都對應了DFA中的一個狀態

  具體算法:

  Input : 一個NFA N

  Output : 接受相同語言的DFA D

  Method : 為D構架一個transition table(轉換表) Dtran,每個DFA的狀態是一個NFA的狀態集合(這里一定要注意前面說過的1)2)兩點)。我們定義一些操作:

  s 表示NFA的狀態,T 表示NFA的狀態集合,a表示一個input symbol

  ε-transition(ε轉換)就是說input symbol為ε時的transition(轉換)

  操作(operation)

  描述(description)

  ε-closure(s)

  從NFA的狀態s出發,只通過ε-transition到達的NFA的狀態集合

  ε-closure(T)

  NFA的集合T中的狀態p,只通過ε-transition到達的NFA的狀態集合,再求這些集合的交集。用數學表達就是 {p|p 屬于 ε-closure(t) , t屬于T}

  move(T,a)

  NFA的集合,這個集合在input symbol為a,狀態為T中任意狀態情況下,通過一個轉換得到的集合

  注意一下,所有的操作都是針對NFA的狀態或者狀態集合,得到的時NFA的狀態集合,或者說是DFA看為一個狀態

  Subset Construction

  初始Dstates,它僅僅含有狀態(D的狀態)ε-closure(s0),并且狀態未被標記,s0表示開始狀態,注意,Dstates放的是D的狀態

while ( Dstates 有未標記的狀態 T ) { // T是D中的一個狀態,也是N中一個狀態集標記 T;for ( input symbol a ){                  // 遍歷所有的input symbolU = ε-closure(move(T, a));        // move為NFA的move函數if ( U 不在 Dstates 中 )把U作為尚未標記的狀態加入Dstates;Dtran[T, a] = U} }

  注意,狀態s,ε-closure(s)一定包含s

  我們先來熟悉上面的操作operation,再來看上面的算法

ε-closure(0) = {0, 1, 2, 4, 7}   // 從0狀態出發的,input symbol為ε的所有狀態的集合 ε-closure(3) = {1, 2, 3, 4, 6, 7} ε-closure(8) = {8} ε-closure( {3, 8} ) = ε-closure(3) U ε-closure(8) = {1, 2, 3, 4, 6, 7, 8} move(0,a) = 空 move(7,a) = {8} move(8,b) = {9} move( {0, 1, 2, 4, 7}, a) = move(0,a) U move(1,a) U move(2,a) U move(4,a) U move(7,a) = {3, 8}

?

  現在可以回去理解一下算法了。

  這里再說說求ε-closure(T)的算法:

把T的所有狀態壓入stack(棧); ε-closure(T)的初始值為 T 中的所有元素 ;  // 也就是一定包含他們本身 while( 棧非空 ) {彈出棧頂元素 t ;for( 每個屬于 move(t, ε) 的狀態 u ){if( u 不在 ε-closure(T) 中 ){u 加入 ε-closure(T);把 u 入棧;}} }

  下面對上圖如何使用Set Construction算法來構建DFA做一個詳細的描述:

  1. 初始化Dstates 把集合 ε-closure(s0) = {0, 1, 2, 4, 7}作為第一個狀態,設此狀態為 A

  2. 現在轉化,input symbol {a, b},因此,求:

  ε-closure(move(A, a));

  ε-closure(move(A, b));

  這里會得到2個狀態

  ε-closure(move(A, a)) = {1, 2, 3, 4, 6, 7, 8},設其為 B

  ε-closure(move(A, b)) = {1, 2, 4, 5, 6, 7}, 設其為C

  B,C放入Dstates

  改寫 Dtrans

  最終得到的 Dtrans 為:

  A = {0, 1, 2, 4, 7}

  B = {1, 2, 3, 4, 6, 7, 8}

  C = {1, 2, 4, 5, 6, 7}

  D = {1, 2, 4, 5, 6, 7, 9}

  因此,NFA轉化成為DFA:

總結

以上是生活随笔為你收集整理的词法分析(4)---NFA与DFA的转化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。