編譯原理作業 RE NFA DFA minDFA

2021-09-17 07:52:44 字數 1637 閱讀 8490

題目將乙個正規表示式(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 ...