編譯原理 詞法分析(二)

2021-08-09 14:43:54 字數 2392 閱讀 9909

乙個有窮自動機可以把乙個描述詞素的模式變成乙個詞法分析器,從本質上來講,有窮自動機是與狀態轉換圖相類似的圖,它有以下特點:

乙個不確定的有窮自動機(nondeterministic finite automate,下文簡稱nfa)由以下部分組成:

從nfa的組成部分可以看出,它和狀態轉換圖的不同之處在於:

同乙個符號可以標記從同乙個狀態出發到達多個目標狀態的多條邊,即轉換函式是一對多關係的;

一條邊的標號不僅可以是輸入符號集合中的符號,也可以是空串ε。

另外,我們也可以把乙個nfa用一張轉換表來表示,表的每行對應狀態,表的每列對應輸入符號和ε(實際上就是在資料結構中學過的圖的鄰接表)。下面是乙個nfa及其對應的轉換表:

確定的有窮自動機(deterministic finite automate,下文簡稱dfa)是nfa的乙個特例,其中:

同樣的,乙個dfa也能用乙個轉換表來表示。由於此時每個表項中只有乙個狀態,因此可以省去括號,下面是和在nfa中同乙個正規表示式對應的dfa及其轉換表:

nfa抽象地表示了用來識別某個語言中的串的演算法,而相應的dfa則是乙個簡單具體的識別串的演算法。在構造詞法分析器時,真正實現或模擬的是dfa。本節先不論如何從乙個正規表示式構建乙個有窮自動機,而是討論如何從乙個nfa轉換得到相應的dfa。

從nfa轉換得到乙個dfa通常使用子集構造法(subset construction)。子集構造法的基本思想是讓構造得到的dfa的每個狀態對應於nfa的乙個狀態集合,下面對其進行說明。

由nfa構建dfa的子集構造演算法,輸入乙個nfa n,輸出乙個接受同樣語言的dfa d。在此期間會為d構造乙個轉換表dtran,d的每個狀態是n的狀態的乙個子集,也就是說,d的乙個狀態,是在n中從狀態s開始經過標號為a或者ε的邊能夠到達的所有狀態的集合,為此,我們需要認識在nfa狀態集上的操作:

其中,ε-closure(t)操作的詳細過程如下:

我們必須找出當n讀入了某個輸入串之後可能位於的所有狀態集合。首先,在讀入第乙個輸入符號之前,n可以位於集合ε-closure(s0)中的任何狀態上(s0是n的初始狀態);接著,假定n在讀入串x之後位於集合t中的狀態上,如果下乙個輸入符號為a,那麼n可以移動到集合move(t, a)中的任何狀態上,又因為n可以在讀入a後再執行幾個ε轉換,所以n在讀入串xa後可以位於ε-closure(move(t, a))中的任何狀態上。這個過程可以用下面的偽**表示:

下面我們來實際操作一下。對正規表示式(a|b)*abb,它的乙個nfa如下圖:

下面我們使用子集構造法構造乙個等價的dfa:

dfa的初始狀態a是ε-closure(0),即a=,a中的狀態就是從狀態0出發,只經過標號為ε的邊到達的所有狀態;

由於輸入符號只有a和b,下面我們計算ε-closure(move(a, a))ε-closure(move(a, b)),得到dtran[a, a]=ε-closure(move(a, a))=dtran[a, b]=ε-closure(move(a, b))=,令狀態b為dtran[a, a],狀態c為dtran[a, b]

類似第2步,現在我們需要計算ε-closure(move(b, a))ε-closure(move(b, b))ε-closure(move(c, a))ε-closure(move(c, b)),如果出現新的集合,則按照大寫字母順序標記,直到沒有新狀態產生為止;

把包含nfa終止狀態的dfa狀態標記為dfa的終止狀態。

這樣我們就得到了乙個等價的dfa,下面是這個dfa及其轉換表:

編譯原理(二)詞法分析

1.詞法分析程式的功能 2.實現方案 3.單詞種類及輸出形式 單詞種類 保留字 識別符號 常數 分界符等。輸出形式 二元式,單詞類別,單詞值 按單詞種類分類,也可以將保留字和界符採用一符一類。狀態圖 用於識別 接受 一定的字串。包含乙個初始狀態 初態 至少乙個終止狀態 終態 畫法比較簡單 注意 1....

編譯原理詞法分析

編譯原理實驗一 詞法分析練習 include include include define tokenmax 100 define progmax 1000 define k esc 27 void analytics 詞法分析 void scanner 輸入掃瞄 bool isletter cha...

詞法分析(編譯原理)

詞法分析 英語 lexical analysis 是電腦科學中將字串行轉換為單詞 token 序列的過程。進行詞法分析的程式或者函式叫作詞法分析器 lexical analyzer,簡稱lexer 也叫掃瞄器 scanner 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱...