編譯原理第三章筆記--詞法分析
3.1對詞法分析器的要求
一、單詞符號
語言中具有獨立意義的最小的語法符號
單詞的種類:
基本字 if...else這種
識別符號 起名來表示變數名、函式名
常數
運算子
界符 ; {} () , 這種
二、單詞的表示形式
常常用二元式來表示 <單詞種別,單詞符號的屬性值>
單詞種別
(1)關鍵字,運算子,界符
一字一種編碼(處理起來方便?)
(2)常數
按型別分別給出編碼 整形 布林型
(3)識別符號
統歸一種,只給一個編碼
若一個種別只包含一個符號,種別編碼可以代表
若一個種別包含多個符號,需要用種別編碼+屬性值來區分
單詞符號的屬性資訊
屬性值的表示方法:
(1)基本字,運算子,界符 只給出種別編碼
(2)常數 標準二進位制表示
(3)識別符號 字串編碼或對應的符號表項地址
3.2詞法分析器的設計
一、詞法分析器的結構
1、輸入緩衝區。、預處理子程式
(1)輸入源程式文字,放入輸入緩衝區中,詞法分析工作可在這個輸入緩衝區中工作
(2)剔除無用的空白,跳格(TAB),回車,換行等編輯性字元;若空白符號為單詞符號的界符,就將若干空白和併為1個
(3)剔除註釋行,比如/*…*/
(4)源程式的出錯列表列印
(5)將預處理好的子程式放到掃描緩衝區中
2、掃描緩衝區、掃描器
(1)掃描緩衝區
設兩個半區,可互補使用
設兩個指標
起點指標:指出正在識別單詞起點位置
搜尋指標:向前搜尋以尋找單詞終點
(2)掃描器:掃描緩衝區,直接進行單詞的識別
三、單詞符號的識別
1. 超前搜尋
在單詞識別的過程中,通過向前多讀幾個符號的形式,準確的進行單詞的識別
一旦確定識別到的單詞之後,需要進行掃描指標的回退,保證單詞識別工作的順利進行
2. 直接分析法
(1)基本思想
根據讀來的第一個字元的種類分別轉到各種子程式處理。這些子程式功能就是識別以相應字元開頭的各種單詞。
(2)方法
①以字母開頭的
基本字、識別符號、格式說明符,…
②以小數點開頭的
③以數字開頭的
分析流程圖
3. 狀態轉換圖法
(1)狀態轉換圖:一張有限方向圖
(2)狀態轉換圖的功能
識別(接受)一定的符號串(單詞)
(3)狀態轉換圖的結構
①結點:代表狀態,用圓圈表示
②箭弧:狀態之間用箭弧連線
③箭弧上的標記:代表在射出節點下可能出現的字元或字串
一個完整的狀態轉換圖有n個狀態,其中有一個初態,至少要有一個終態(用雙圓圈表示)
“*”表示在該狀態下多讀進一個字元
3.3 正規表示式與有限自動機
一、詞法分析器的構造的基本思路:
程式語言的描述
詞法規則
正規表示式
有限自動機
詞法分析程式
二、正規式與正規集
我們可以把具有相同特徵的字放在一起組成一個集合,即所謂的正規集
然後使用一種形式化的方法來表示正規集,即所謂的正規式
正規式是描述單詞結構的一種形式;
正規集是該類單詞的全集。
1、正規式與正規集的定義(遞迴的定義方法)
(1)ε和φ是∑上的正規式,它們所表示的正規集分別為{ε}和φ
(2)任何a∈∑,是∑上的一個正規式,他所表示的正規集為{ a }
(3)假定U和V都是∑上的正規式,他們所表示的正規集分別記為L(U)和L(V),那麼
(a) (U|V)是正規式,所表示的正規集為L(U)∪L(V)
(b) (UV)是正規式,所表示的正規集為L(U) · L(V)(連線積)
(c) (U)*是正規式,所表示的正規集為 (L(U))*(閉包)
僅由有限次使用(1)(2)(3)所得到的表示式才是∑上的正規式,僅由這些正規式所表示的字集才是∑上的正規集。運算的優先順序為:“ * ” > “ · ” > “ | ”
2.兩個正規式的等價
若兩個正規式U和V所表示的正規集相同,則認為二者等價,記為:U = V
3.正規式的性質
或的交換率、或的結合律、連線積的結合律、分配率,εU = Uε = U
我們把狀態轉換圖再形式化一下及所謂的有限自動機
有兩種:
確定的有限自動機(DFA)(Deterministic Finite Automata)
非確定的有限自動機(NFA)(Non-deterministic Finite Automata)
1、確定的有限自動機
M = (S, ∑, f, s0, F)
S是狀態集合
∑是輸入符號的字母表
f是對映
s0是S初始狀態,唯一
F是終止狀態的集合,是S的子集(可空)
2、表示方法:狀態轉換矩陣、狀態轉換圖
3.DFA M的識別功能
對於∑*中任何字α,如果存在一條從初態結點到某個終態結點的道路,這條路上所有的識別符號連成的字等於α ,則α可被DFA M所識別(接受,讀出)
四、非確定的有限自動機(NFA)
M = (S, ∑, f, s0, F)
S是狀態集合
∑是輸入符號的字母表
f是對映(f是非單值的,M是非確定)
s0是S初始狀態,是S的子集,不唯一
F是終止狀態的集合,是S的子集(可空)
2、表示方法:狀態矩陣、狀態轉換圖
3.有限自動機的等價
對任何兩個有限的自動機M1和M2,若有L(M1)=L(M2),則稱M1與M2等價。
注: 若M的某些結點既是初態結點又是終態結點,或者存在一條從某初態結點到某個終態結點的ε通路,那麼空字ε可為M所識別。DFA是NFA的一個特例,對於每個NFA M存在一個DFA M’使得L(M) = L(M’),也就是說M和M’是等價的。
五、正規式與有限自動機的等價性
定理1:對於任何∑上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)構造一個拓廣的轉換圖(2)使用分裂規則對V進行分裂,加進新結點,直到把圖轉換成每條弧上標識為∑上的一個字元或ε
二 把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弧而到達的狀態結點的全體
求Ia 可以分為兩步:
根據集合I,求集合J(一條a弧)
求J的ε閉包ε_CLOSURE(J),即是Ia
用子集法把M’確定化
確定有限自動機的化簡(最少化)
化簡的概念 :尋找一個狀態比DFA M少的DFA M’,使得 L(M’) = L(M)
也就是要保證化簡後的狀態與之前的等價
兩個狀態是可區別的
化簡DFA的一般步驟
(1) 檢查狀態轉換函式是否為全函式。
(2) 用化簡演算法進行化簡
(3) 去掉死狀態第二步中的化簡演算法 :
(1) 基本思想
把M的狀態集分割為一些不相交的子集,使得任何不同的兩個子集狀態都是可區別的,而同一個子集中的任何狀態都是等價的,最後讓每個子集選一個代表,同時消去其他等價狀態
(2) 化簡演算法
① 把S的終態和非終態分開,分成終態集合非終態集
②檢查每個集合看能否進一步劃分:
對於某個I(i)
另I(i)={q1 ,q2 ,…,qk}
若存在一個輸入字元a使得I(i)a不全包含在現行П的某個子集I(j)中,就將I(i)一分為二
③一般地,若I(i)a落入現行П中N個不同子集,則應將I(i)劃分為N個不相交的組,使得每個組J的Ja都落入П的同一子集,這樣再形成新的分劃
④重複上述過程,直至分劃中所含的子集數不再增長為止。至此,П中的每個子集已不可再分。也就是說,每個子集中的狀態是互相等價的,而不同子集中的狀態則是互相可區別的。
⑤經過上述過程後,得到一個最後分劃П.對於這個П中的每個子集,選取子集中的一個狀態代表其它狀態。
課後題
感想:
通過這一章的學習我對編譯原理的概念又有了一個更深一步的認識。
本章的重點知識是正規式與有限自動機的相互轉化。要掌握正規式轉化為有限自動機和有限自動機轉化為正規式的能力,有限自動機到正規式要按替換規則進行合併;正規式到有限自動機要進行分解,先構造NFA,然後把NFA按子集法確定化為DFA。
感覺最難的在於狀態轉換圖的確定化過程和化簡過程裡,幾次做題捋思路捋到抓狂。
感覺自己做課後題來還是比較吃力的。