###### tags: `compiler` `note` `thu` # Regex至DFA的轉換(含化簡) ### 本頁使用$(a\ |\ b)^*abb$做為操作的範例。 ## 1. Regex至$\epsilon$-NFA ### a. Regex語法 - `|`: 「或」的意思。 - `*`: ***Kleen closure***, 可包含所有集合內的元素字串組合。(含空集$\phi$) - `+`: 類似***Kleene closure***, 但不包含空集$\phi$。 - 直接相接,e.g. $r_1r_2$, 其中$r_1$ ### b. $\epsilon$-NFA和Regex語法的對應 ![](https://i.imgur.com/8yoCSBm.jpg) ### c. 合在一起 - 先分析regex,將其轉換成多個小的NFA - 用$\epsilon$把小NFA們按語法連結起來。 - 檢查路徑是否有包含closure的要求(e.g. 7->0的$\epsilon$) ![](https://i.imgur.com/ZzEqPG9.jpg) ## 2. $\epsilon$-NFA至DFA - `e-closure`: 透過$\epsilon$的移動可以逹到最遠的節點集合。 ### a. 從起始狀態開始觀察NFA對於輸入的狀態變化。 #### 起點: ``` e-closure(0): {2, 4, 7} -> (STATE 0) ``` #### 分支: ##### 1. 先吃a ``` move({2, 4, 7}, a) = {3, 8} e-closure({3, 8}) = {2, 4, 7, 8} -> (STATE 1) ``` - 再吃a: 不動 - 再吃b: ``` move({2, 4, 7, 8}, b) = {5, 9} e-closure({5, 9}) = {2, 4, 7, 9} -> (STATE 2) ``` - 再吃a: ``` move({2, 4, 7, 9}, a) = {3, 8} e-closure({3, 8}) = {2, 4, 7, 8} -> (STATE 1) ``` - 再吃b: ``` move({2, 4, 7, 9}, b) = {5, 10} e-closure({5, 10}) = {2, 4, 7, 10} -> (STATE 3) (ACCEPTED) ``` - 再吃a: STATE 1 - 再吃b: STATE 0 ##### 2. 先吃b ``` move({2, 4, 7}, b) = {5} e-closure({5}) = {2, 4, 7} -> (STATE 0) ``` ### b. 把整理結果畫成圖 ![](https://i.imgur.com/QmfEk5t.jpg) ## 3. DFA狀態數最小化(化簡)