編譯原理中的正規表示式 NFA和DFA

2021-06-16 09:14:52 字數 2856 閱讀 1938

from : 

正規表示式,接觸得已經不少,各種語言都會有些正規表示式的庫來增強字串處理功能,這裡就編譯原理的詞法分析要用到的內容**下下。

嗯,我很懶……還是課件截圖:

這裡用遞迴定義來定義正則的,原因是簡潔方便,方便以後進一步學習,比如nfa。如果要說正規表示式的術語定義,又得找維基了,鏈結

「在電腦科學中,是指乙個用來描述或者匹配一系列符合某個句法規則的字串的單個字串」

簡單點講,就是用一種方便點的表示式來描述乙個複雜的語言。

舉個例子:a(a|b)*b這個正規表示式表示的意義就是a開頭,b結尾的,由a和b構成的字串的集合。

nfa,nondeterministic finite automata,不確定的有限狀態自動機。

要先理解fa先,也就是有限狀態自動機,其實就是個識別器,只能對每個可能的輸入串簡單地回答「是」或「否」。

然後nfa是一種fa,其特點是在某個狀態s下輸入某個字元a,可以進入多個不同狀態,還有就是空串ε也可以作為輸入字元標號。

這裡繼續舉例說明:

這個語言是以abb結尾的由a和b構成的字串的集合,而這個nfa可以檢測出乙個字串是否屬於這門語言,既是是否在該集合內。判斷方法就是把字串乙個個字元輸進去跑,看是否能走到接收狀態(3),能就是屬於該語言,不能則不屬於。

至於nfa怎麼來的,下面再講,先了解下nfa的樣貌先。

nfa的幾個組成部分:

1、乙個有限的狀態集合s,比如說上面的4個狀態0、1、2、3,狀態也可以有冗餘,不過能簡化肯定簡化更好;

2、乙個輸入符號集合∑,即輸入字母表(input alphabet),要記住,我們假設了代表空串的ε不是∑中的元素,要是乙個字串有不屬於∑中的元素,那麼肯定不能走完該nfa;

3、乙個轉換函式(transition function,也可以稱為遷移函式),為每個狀態和∑∪中的每個符號都給出了相應的後繼狀態(next state)的集合;(在生成nfa或者dfa的時候有同樣轉換函式的狀態是可以合併的)

主要就是上面3個組成部分,另外,有兩種特殊的狀態:

1、乙個狀態s0被指定為開始狀態,或者說是初始狀態,也就是最開始接受輸入字元的狀態,有且只有乙個;

2、s的乙個子集f被指定為接受狀態或者是終止狀態集合。(注意,可以包括初始狀態)

dfa,deterministic finite automata,確定的有限狀態自動機。

是一種特殊的nfa,因為dfa規定了每個狀態對每個字元輸入只有乙個後繼狀態,而且不用空串ε作為輸入字元,其餘和nfa一樣。所以上面的圖中的圖也是乙個dfa。

大概囉嗦了下正規表示式、nfa和dfa,那麼要說說幾個之間的轉換。為什麼要這麼多表達方式,因為正規表示式方便書寫理解,而dfa更方便計算機去運算執行。嗯,至於nfa,則是正規表示式轉dfa中間的乙個過渡圖。因為一步到位搞不定,而且有時候ε作為輸入是蠻方便的。

從正規表示式構造nfa,書上有個演算法,可以講任何正規表示式轉變為接受相同語言的nfa。這個演算法是語法制導的,也就是說它沿著正規表示式的語法分析樹自底向上遞迴地進行處理。對於每個子表示式,該演算法構造乙個只有乙個接受狀態的nfa。

首先,對幾種子表示式進行構造:(龍書第二版裡面有圖,就懶點先,等ppt出來後再補截圖)

1、對ε構造……(p101)

2、對字母表∑中的子表示式a構造……(p101)

3、假設s和t是正規表示式,分別對r=s|t,r=st,r=s*的構造……(p101)

按照這樣的分治方法,很容易就構造出來nfa了(雖然看起來會很複雜的感覺,但是很簡單)

接下裡是從nfa到dfa的轉換問題,這是要的,畢竟那麼複雜的nfa,看著頭暈。

這個,只能能構造出dfa的轉換表dtran就可以了。至於轉換表怎麼來,有個演算法如下:

輸入:乙個nfa n

輸出:乙個接受同樣語言的dfa d

設s0是nfa的初始狀態.d的開始狀態為ε―閉包().

初始,ε―閉包()是dstates中僅有的狀態(state),並且尚未標記(unmarked).

while dstates中有尚未標記的狀態t do

begin 標記t(mark t);

for 每個輸入符號a do

begin u:=ε―閉包(move(t,a));

if u不在dstates中 then

把u作為尚未標記的狀態加入dstates;

δd[t,a]:= u

end

end

這個d[t,a]就是所說的轉換表,拿個例子走一遍,這個演算法就很容易記住了。差點忘了,裡面提到的閉包概念:

設d和t是nfa的狀態子集.

ε―閉包(d)=(ε―closure(d))

move(t,a)=

(暫時沒截圖,之後再整理好看點)

編譯原理 正規表示式轉NFA

從txt檔案中讀入正規表示式 include include include include include define max token 100 using namespace std 詞struct token int readtxt string filename,vector token...

正規表示式轉NFA

最近一直在忙著寫大作業,考試複習,複習演算法的時候寫了一些隨筆,現在忙起來都落下了部落格,這裡有乙個vc 寫的大作業,主要是正規表示式轉nfa並顯示。內容如下。介紹一下nfa在表示的結構設計,由於nfa本身是一種有向圖,所以這裡的儲存結構設計和鄰接表相似,圖中的每個節點後面是一些與其連線的節點的值,...

正規表示式轉NFA

正規表示式有三種基本的運算 連線 concatenation 例如 abc,由a,b,c組成 聯合 union 例如 a b c,表示a或者b或者c kleene閉包 kleene 例如 ab 表示ab串不出現,或者出現1次或一次以上 其它的運算如 等都可以用以上三種基本運算或者運算的組合來表示。2...