1. 程式人生 > >編譯原理 詞法分析 一

編譯原理 詞法分析 一

轉發自:
作者:jzyhywxz 
來源:CSDN 
原文:https://blog.csdn.net/jzyhywxz/article/details/78285722 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

    本文是詞法分析的第一篇文章,主要介紹在詞法分析過程中需要用到的一些基本概念,包括詞法單元、模式和詞素以及三者之間的關係,理解這些內容對學習詞法分析過程十分重要。

詞法分析器的作用
詞法分析是編譯的第一階段。詞法分析器的主要任務是讀入源程式的輸入字元,將它們組成詞素,生成並輸出一個詞法單元序列,這個詞法單元序列被輸出到語法分析器進行語法分析。另外,由於詞法分析器在編譯器中負責讀取源程式,因此除了識別詞素之外,它還會完成一些其他任務,比如過濾掉源程式中的註釋和空白,將編譯器生成的錯誤訊息與源程式的位置關聯起來等。總而言之,詞法分析器的作用如下: 
1. 讀入源程式的輸入字元,將它們組成詞素,生成並輸出一個詞法單元序列; 
2. 過濾掉源程式中的註釋和空白; 
3. 將編譯器生成的錯誤訊息與源程式的位置關聯起來; 
4. 其它。

詞法單元、模式和詞素
詞法分析涉及到三個重要的相關術語——詞法單元、模式和詞素: 
- 詞法單元由詞法單元名和可選的屬性值組成。詞法單元名是一個詞法單元的引用(別名),它將作為語法分析器處理的輸入符號。當有多個詞素的詞法單元名相同時,可以附加屬性值資訊來區別這些詞素。詞法單元名將影響語法分析過程中的決定,而屬性值將影響語法分析之後對這個詞法單元的翻譯(具體翻譯成哪一個詞素); 
- 模式描述一個詞法單元的詞素可能具有的形式; 
- 詞素是一個字元序列(串),它和某個詞法單元的模式匹配,並被詞法分析器識別為該詞法單元的一個例項。

為了進一步說明詞法單元、模式和詞素之間的關係,我們舉一個例子:

PS:由於詞法分析器通常還要和符號表進行互動,因此屬性值常常作為一個指標指向符號表中的某個條目。

詞法單元的規約
我們知道,每個詞法單元都有一個模式來描述它的所有詞素,正則表示式正是這樣一種用來描述詞素模式的重要方法。在真正介紹正則表示式之前,我們還需要了解串和語言以及一些相關的術語和運算,這些內容能幫助我們十分容易地理解正則表示式。


某個符號集合上的一個串是該集合中符號的一個有窮序列。這句話說明了串的兩個特點:第一是組成串的符號都來自某個符號集合,第二是串的長度是可數的。舉個例子:對集合A={a,b,…,z,A,B,…,Z}來說,它的一個串只能包括大小寫字母,並且長度是可數的。

下面定義了一些串相關的術語:

下面定義了串上的運算:

語言
語言是某個給定的符號集合上一個任意的可數的串集合。這句話稍微有點抽象,我們把這句話拆分開來解釋:首先,語言是一個集合;其次,這個集合中的元素是串,並且集合的大小是任意的;最後,這些串是依據某個符號集合生成的。

下面定義了語言上的運算:

正則表示式
正則表示式可以用來描述詞素的模式,一個正則表示式可以由較小的正則表示式遞迴的構建:

下面我們舉例說明。對於符號集合∑={a,b},有: 
- 正則表示式a表示語言{a}; 
- 正則表示式a|b表示語言{a,b}; 
- 正則表示式(a|b)(a|b)表示語言{aa,ab,ba,bb}; 
- 正則表示式a*表示語言{ε,a,aa,aaa,…}; 
- 正則表示式(a|b)*表示語言{ε,a,b,aa,ab,ba,bb,aaa,…}; 
- 正則表示式a|a*b表示語言{a,b,ab,aab,aaab,…}。

上面通過基本的並、連線和閉包運算遞迴定義了正則表示式,為了增強正則表示式描述串模式的能力,也出現了許多針對正則表示式的擴充套件,下面是一些比較典型的擴充套件:

詞法單元的識別
上面介紹瞭如何用正則表示式來表示一個模式,下面我們將介紹如何根據詞法單元的模式來識別一個與該模式匹配的詞素,為此,我們首先將模式轉換成狀態轉換圖。

一個狀態轉換圖由一組表示狀態的結點和表示輸入字元的邊構成,詞法分析器在掃描輸入字串的過程中尋找和某個模式匹配的詞素,狀態轉換圖中的每個狀態代表一個可能在這個過程中出現的情況。一個狀態轉換圖有如下特點: 
- 有一個初始狀態,該狀態由一條無出髮結點的、標號為“start”的邊指明。在讀入任何輸入符號之前,狀態轉換圖總位於它的初始狀態; 
- 有某些最終狀態,該狀態用雙層的圈表示。這些狀態表明已經找到一個詞素; 
- 有某些回退狀態,該狀態附近有一個“*”標明。在識別“3+4”這個串時,只有當掃描到“+”符號時,才能確定前面的數字符號“3”,此時識別出了詞素“3”,並且需要回退一個字元。

下面是詞法單元relop的狀態轉換圖,它表示比較運算子<、>、<=、>=、<>和=:

根據這個狀態轉換圖,我們可以十分容易的編寫出一段程式碼來識別這些比較運算子,這裡就不再贅述了
--------------------- 
作者:jzyhywxz 
來源:CSDN 
原文:https://blog.csdn.net/jzyhywxz/article/details/78285722 
版權宣告:本文為博主原創文章,轉載請附上博文連結!