這一章我們將從詞法分析器、正規表示式與有限自動機以及語法分析器的自動產生三方面了解詞法分析,但我理解的這張的重點是正規表示式與有限自動機。
首先我們來了解一下詞法分析器是什麼:它是一組把輸入的源程式轉換成單詞符號的程式,而語法分析器的構造方法包括兩方面,一方面是根據詞法直接程式設計序即有限自動機的手工方法,另一方面是利用一些工具的自動方法。而這章的重點就是手工方法。
要想合理的設計出詞法分析器,就需先搞清楚一些基本的東西,比如單詞符號的概念、單詞的種類及單詞的表示形式(二元式《單詞種別,單詞符號的屬性值》),而後是詞法分析器的結構。詞法分析器包括輸入緩衝器,預處理子程式掃瞄器和掃瞄緩衝區等四部分,詞法分析器的工作流程如下:
(1)輸入源程式文字,放入輸入緩衝區中,詞法分析工作可在這個輸入緩衝區中工作
(2)剔除無用的空白,跳格(tab),回車,換行等編輯性字元;若空白符號為單詞符號的界符,就將若干空白和並為1個
(3)剔除注釋行,比如/*…*/
(4)源程式的出錯列表列印
(5)將預處理好的子程式放到掃瞄緩衝區中
(6)在掃瞄緩衝區設兩個半區,可互補使用,並且設兩個指標:
起點指標:指出正在識別單詞起點位置
搜尋指標:向前搜尋以尋找單詞終點
(7)用掃瞄器直接對單詞進行識別
講到這裡,我們說一下單詞的識別,單詞的識別包括三種方法:
(1)超前搜尋:在單詞識別的過程中,通過向前多讀幾個符號的形式,準確的進行單詞的識別,一旦確定識別到的單詞之後,需要進行掃瞄指標的回退,保證單詞識別工作的順利進行
(2)直接分析法:根據讀來的第乙個字元的種類分別轉到各種子程式處理。這些子程式功能就是識別以相應字元開頭的各種單詞。
直接分析流程圖
(3)狀態轉換圖法
狀態轉換圖是一張能識別一定符號串的有限方向圖。一張狀態轉換圖包括三個因素:
①結點:代表狀態,用圓圈表示
②箭弧:狀態之間用箭弧連線
③箭弧上的標記:代表在射出節點下可能出現的字元或字串
乙個完整的狀態轉換圖有n個狀態,其中有乙個初態,至少要有乙個終態(用雙圓圈表示)
詞法分析器需要識別語言中具有不同特徵的字,便會用到正規式與正規集--把具有相同特徵的字放在一起組成乙個集合,即所謂的正規集(一類單詞的全集), 然後使用一種形式化的方法來表示正規集,即所謂的正規式(用來描述單詞結構的一種形式)。正規事與正規集的概念就不在此贅述了。正規式具有或的交換律、或的結合律、連線集的結合律和分配律等性質。
有了這些基礎知識,接下來了解一下有限自動機。有限自動機一般用五元式表示,可分為
(1)確定有限自動機
m = (s, ∑, f, s0, f),其中
s是乙個有限的狀態集合,它的每個元素我們稱為乙個狀態
∑是乙個有窮的輸入符號的字母表,它的每個元素我們稱為乙個輸入字元
f是從 s×∑ →s的單值部分對映
s0是s的乙個元素,為初始狀態,它是唯一的
狀態集合f是終止狀態的集合,它是s的子集(可空)
【需要注意的是:確定有限狀態自動機不是乙個機器而是用來模擬計算機識別功能的數學模型;確定性是指,f(s, a) = s』 是單值函式。 對任何狀態s∈s,和輸入符號 a∈∑ , f(s, a) 唯一的確定下乙個狀態;有限性是指,s是乙個有限的狀態集合,並且∑是乙個有限的輸入符號的字母表】
(2)非確定有限自動機
m = (s, ∑, f, s0, f),其中
s是乙個有限的狀態集合,它的每個元素我們稱為乙個狀態
∑是乙個有限的輸入符號的字母表,它的每個元素我們稱為乙個輸入字元
f是從s×∑*→2s 的部分對映,其中,2s表示s的冪集合(所有s的子集組成的集合)(f是非單值的m是非確定)
狀態集合s0是初始狀態集合,它是s的子集
狀態集合f是終止狀態的集合,它是s的子集
接下來用乙個**來區分dfa m和nfa m
dfa m
nfa m
表示方法
1.狀態轉換矩陣表示法
2.狀態轉換圖
1.狀態轉換矩陣表示法
2.狀態轉換圖
注意(1)若m的初態結點同時又是終態節點,則空字可被m識別
(2)dfa m所能識別的字的全體記為l(m)
(3)如果乙個dfa m的輸入字母表為∑,則我們稱m是∑上的乙個dfa
(4)若v是∑上的乙個正規集,當且僅當存在乙個∑上的dfa m,使得v = l(m)
區別f是從 s×∑ →s的單值部分對映
s0是s的乙個元素,為初始狀態,它是唯一的
f是從s×∑*→2s 的部分對映
狀態集合s0是初始狀態集合,它是s的子集
特殊性dfa是nfa的乙個特例,對於每個nfa m存在乙個dfa m』使得l(m) = l(m』),也就是說m和m』是等價的
接下來說一點比較重要的東西,那就是有限狀態自動機的等價:對任何兩個有限的自動機m1和m2,若有l(m1)=l(m2),則稱m1與m2等價。 若m的某些結點既是初態結點又是終態結點,或者存在一條從某初態結點到某個終態結點的ε通路,那麼空字ε可為m所識別 。另一點是正規式與有限自動機的等價性。等價性定理:任何對於∑上nfa m都可構造乙個∑上的正規式v,使得 l(v) = l(m) 。由於等價性原理,可以實現正規式與有限自動機的相互轉換:
由乙個nfa m,構造乙個正規式v的方法:
(1)在m轉換圖上加進x結點和y結點,從x結點用弧ε連線m的所有初態結點,m的所有終態結點用弧ε連線到y,得到乙個nfa m』,且l(m) = l(m』)
(2)使用替換規則逐步消去m』的所有結點,直到只剩下x結點和y結點,在消去過程中,逐步使用正規式來標記箭弧
定理2. 對於∑上的每乙個正規式v,存在乙個∑上的dfa m,使得l(m) = l(v)
由乙個正規式v,構造乙個dfa m的方法
(1)根據v,構造乙個nfa m』,使得l(m』) = l(v):
a.構造乙個拓廣的轉換圖
b.使用**規則對v進行**,加進新結點,直到把圖轉換成每條弧上標識為∑上的乙個字元或ε
(2)將m』確定化,變為dfa m
在此處宣告兩個定義:
定義1:假定i是m』的狀態集的子集,定義i的ε閉包ε_closure(i)為:
(a)若q∈i,則q∈ε_closure(i)
(b)若q∈i,那麼從q出發經任意條ε弧而能到達的任何狀態q』都屬於ε_closure(i) ;
定義2:假定i是m』的狀態集的子集,a ∈ ∑,定義
ia =ε_closure(j)
其中,j是所有那些可從i中的某一狀態結點出發經過一條a弧而到達的狀態結點的全體
用子集法把m1確定化的步驟:
》構造一張表
》把得到的每個集合看成乙個狀態,得到一張狀態轉換表,該錶的初態就是ε_closure(x),它的終態是那些含有終態y的子集,這樣就得到乙個dfa m 且l(m) = l(m』)
有限自動機構造完了,但是有時候會比較複雜,這時候需要進行化簡即尋找乙個狀態比dfa m少的dfa m』,使得
l(m』) = l(m)。
化簡dfa的一般步驟 :
(1) 檢查狀態轉換函式是否為全函式。
所謂全函式,是指每個狀態對每個輸入符號都有轉換
若不是全函式,可以引入乙個「死狀態」d,d對所有輸入符號都轉換到d,如果狀態s對輸入符號a沒有轉換,那麼加上從s到d的a轉換。
(2) 用化簡演算法進行化簡
(3) 去掉死狀態
注:1.兩個狀態等價的概念
設s和t是m兩個不同的狀態,從s出發能讀出某個字而停於終態,那麼同樣,從t出發也能讀出同乙個字而停在終態,反之亦可
2.兩個狀態是可區別的
若dfa m的兩個狀態s和t不等價,則稱這兩個狀態是可區別的
注:終態和非終態是可區別的,因為終態可以讀出空字ε,而非終態不能讀出空字ε
編譯原理 第三章詞法分析總結
詞法分析 在詞法分析這一章主要通過學習了詞法分析 正規表示式和有限自動機來了解詞法分析器的構造。詞法分析器是執行詞法分析的程式。將源程式輸入詞法分析器後,詞法分析器從左至右逐個字元的對源程式進行掃瞄,輸出相應的單詞符號,把字串形式的源程式改造成為由單詞符號串組成的程式。輸出的單詞符號一般分為 基本字...
編譯原理第三章詞法分析總結
知識點 1 什麼是詞法分析?詞法分析就是將輸入的源程式從左至右進行掃瞄轉換成單詞符號並輸出。單詞符號是乙個程式語言的基本語法符號,分為關鍵字 識別符號 常數 運算子和界符。2 表示形式 單詞種別,單詞符號的屬性值 單詞種別常用整數編碼來表示,比如關鍵字 運算子 界符採用一字一種編碼的方式,常數按型別...
編譯原理第三章 詞法分析
一 詞法分析器 1 功能 輸入源程式,輸出單詞符號 2 單詞符號常常用二元式來表示 單詞種別,單詞符號的屬性 1 單詞種別 通常用整數編碼來表示 一字一種 關鍵字,運算子,界符 按型別 常數 統歸一種 識別符號 2 單詞符號的屬性值 反映單詞特性或特徵的值 3 詞法分析器運作過程 詞法分析器設計 輸...