正規集:字母表σ
\sigma
σ上的正規表示式e,所描述的語言集合l(e)
從e到l(e)的變換有如下規則:
el(e)
ϵ
\epsilon
ϵ∅\empty
∅a(e
1e_1
e1)
l(e
1e_1
e1)
e 1e
2e_1e_2
e1e2
l(e
1e_1
e1)l(e
2e_2
e2)
e
1e_1
e1 | e
2e_2
e2l(e
1e_1
e1) ∪
\cup
∪ l(e
2e_2
e2)
e 1∗
e_1^*
e1∗
(l(e
1e_1
e1))∗
^*∗從正規表示式e構造fa m的步驟:
1、構造乙個廣義nfa,即只有乙個開始狀態和乙個結束狀態,弧上的標記為e
2、根據分解規則分解e,直到最後得到與e對應的nfa,其分解規則如圖1所示:
圖1 弧e的分解規則
舉例:構造正規表示式((a|b)*|(bb))*對應的nfa
首先,構造初始狀態:
隨後,將最外層的*展開,根據分解規則,狀態圖變為:
再進一步將(a|b)∗
^*∗|(bb)分解為(a|b)∗
^*∗和bb:
最後分解bb和(a|b)∗
^*∗:
此後,可以將nfa轉換為dfa
而使用機器進行分解時,會為了保險而採用thompson法:兩端額外引入空弧
使用此方法作出的狀態轉換圖中,會有大量的空弧
thompson方法的意義:工作最後要用程式進行,方法應該適合所有表示式的分解。同時,此方法可以避免造成不必要的問題使得變化不等價
從re到fa,可以看做是「拆分」的過程
與re到fa相反,從fa到re,可以看做是「合併」的過程
大致思路為:逐個刪除fa的狀態,同時保證有窮自動機所識別的符號串不會減少
舉例將圖2中的fa轉換為re:
圖2 待轉換為re的fa
首先,在兩端加上空弧及對應的開始和終止狀態:
隨後,刪去狀態2和狀態3,注意保持fa的功能:
繼續刪除狀態4:
最後,刪除狀態1,從而得到最終影象:
右線性的轉換規則:
1、u →α
v,v→
βu\rightarrow \alpha v,\ v\rightarrow \beta
u→αv,v
→β轉換為u=α
βu=\alpha\beta
u=αβ
2、u →α
u∣
βu\rightarrow \alpha u|\beta
u→αu∣β
轉換為u=α
∗β
u=\alpha^*\beta
u=α∗
β3、u→α
∣β
u\rightarrow \alpha|\beta
u→α∣
β轉換為u=α
∣β
u=\alpha|\beta
u=α∣β
左線性同理
dfa實際上相當於程式流程圖,可以視準備工作為開始狀態,識別過程為中間狀態,結束工作為終止狀態
整個過程可以用下述偽碼表示:
if ch in letter
then while ch in letter or digit do
begin
name = name + ch; /* 拼成單詞*/
read(ch)
end;
retract; /* 回退指標*/
i = lookup(name) ; /* 查符號表*/
if i != 0 then return (1, name) /* 返回單詞*/
else return (2, name) ;
編譯原理 學習記錄4
直接遞迴 呈現出u x uy u rightarrow xuy u xu y形式的文法產生式 間接遞迴 具有u xu yu mathop rightarrow limits xuy u xuy 形式的推導 產生式呈u u yu rightarrow uy u uy 形式如果是經過多步推導得到,則稱之...
編譯原理 學習記錄11
上回,為了解決移進 規約時的幾個問題,引入了幾個定義 短語 設有文法g z w xuy是它的乙個句型,如果有 z xu yz mathop rightarrow limits xuy z xuy 並且u uu mathop rightarrow limits u u u 則稱句型xuy中子串u為句型...
編譯原理 學習記錄1 程式編譯過程
前端 該階段的編譯工作主要依賴源程式,與目標機無關。語法分析 在詞法分析基礎上,將單詞序列分解成各類語法短語 也稱語法單位,如 程式 語句 表示式 可表示成語法樹 推導樹 通過語法分析,確定乙個輸入串是否構成乙個語法上正確的程式。即 經語法分析可以得到乙個分析樹。問 如何根據單詞序列構造語法分析樹?...