題目將乙個正規表示式(regular expression)轉換成nfa,之後從nfa轉換成dfa,之後在這個dfa中找出mindfa。
一、re到nfa
re(regular expression)為(a|b)*aba(a|b)*
將re化成nfa的三個主要的類別是(a|b)和a*和ab
二、nfa到dfa
1,先把nfa的每個狀態都標上數字
2,從ε-closure(0)開始,(即從0狀態出發,只經過ε的出路所到達的所有狀態)
3,標記a=ε-closure(0),開始計算dtran[ a , a ] = ε - closure ( move ( a , a ) )
和計算dtran[ a , b ] = ε - closure ( move ( a , b ) ) 用於把狀態轉化表補全、
move( a , a )的計算為從a狀態出發,其中能經過a的出路轉換掉
例如:這裡a是ε-closure(0)即,所以a=
這四個數中在nfa中可以知道只有2和7可以在a輸入後有轉換
所以輸入a後 2變化為3
7變化為8
所以move(a,a)的結果是
ε-closure(move(a,a))變為ε-closure()
從3開始只經過ε可以到1,2,4,6,7
從8開始只經過ε可以到。。。到不了
所以綜合一下dtran[ a , a ] =ε-closure ( )
=-----------------------------(3和8自己也在裡面)
然後我們給組數字起名字叫b
同理可得c
然後則重複這一步驟,知道不會再產生新的數為止。
這樣我們就得到乙個完整的狀態轉換表,根據這個表我們可以畫出dfa
三、dfa到mindfa
得到dfa後覺得太長了可以化簡
化簡有規則,規則就是將多餘的節點刪掉
那麼什麼是多餘的節點呢?
加速有a,b,c 三個節點若只有兩個輸入a,b
其中 a輸入a得到b
c輸入a也得到b
並且a輸入b得到c
c輸入b也得到c
那麼a和c是重複的節點 可以將c節點和a節點合併,合併出來的節點叫a節點吧(將指向c的箭頭指向a)
根據這個規則我們將千幸萬苦得到的dfa化簡成mindfa
結束講了如何從 re到nfa
從 nfa到dfa
從 dfa到mindfa
看到這裡了,希望本文對你有幫助。
編譯原理作業五
5.3.1 下面是涉及運算子 和整數或浮點運算分量的表示式的文法。區分浮點數的方法是看它有無小數點。e e t t t num.num num 1 給出乙個 sdd 來確定每個項 t 和表示式 e 的型別 sdd 產生式語義規則 1 e e1 t if e1.type t.type then e.t...
編譯原理 作業十四
算符優先分析 1.接上個作業 p121練習1 完成4 5 兩個步驟。1 計算firstvt和 lastvt。2 找三種關係對。3 構造算符優先關係表。4 是否算符優先文法?答 是。5 給出輸入串 a,a,a 的算符優先分析過程。棧關係 輸入串動作 a,a,a 移進a,a,a 移進 a a,a 歸約 ...
編譯原理 作業十一
1.文法 g s 1 s ab 2 a da 3 b cc 4 c aadc 5 d b 驗證文法 g s 是不是 ll 1 文法?解 first da first first aadc first b follow a follow c follow d select a da select a ...