1. 程式人生 > >編譯原理第三章筆記--詞法分析

編譯原理第三章筆記--詞法分析

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。

感覺最難的在於狀態轉換圖的確定化過程和化簡過程裡,幾次做題捋思路捋到抓狂。

感覺自己做課後題來還是比較吃力的。