詞法分析器的作用
詞法分析是編譯的第一階段。詞法分析器的主要任務是讀入源程式的輸入字元,將它們組成詞素,生成並輸出乙個詞法單元序列,這個詞法單元序列被輸出到語法分析器進行語法分析。另外,由於詞法分析器在編譯器中負責讀取源程式,因此除了識別詞素之外,它還會完成一些其他任務,比如過濾掉源程式中的注釋和空白,將編譯器生成的錯誤訊息與源程式的位置關聯起來等。總而言之,詞法分析器的作用如下:
1. 讀入源程式的輸入字元,將它們組成詞素,生成並輸出乙個詞法單元序列;
2. 過濾掉源程式中的注釋和空白;
3. 將編譯器生成的錯誤訊息與源程式的位置關聯起來;
4. 其它。
詞法單元、模式和詞素
詞法分析涉及到三個重要的相關術語——詞法單元、模式和詞素:
- 詞法單元由詞法單元名和可選的屬性值組成。詞法單元名是乙個詞法單元的引用(別名),它將作為語法分析器處理的輸入符號。當有多個詞素的詞法單元名相同時,可以附加屬性值資訊來區別這些詞素。詞法單元名將影響語法分析過程中的決定,而屬性值將影響語法分析之後對這個詞法單元的翻譯(具體翻譯成哪乙個詞素);
- 模式描述乙個詞法單元的詞素可能具有的形式;
- 詞素是乙個字串行(串),它和某個詞法單元的模式匹配,並被詞法分析器識別為該詞法單元的乙個例項。
為了進一步說明詞法單元、模式和詞素之間的關係,我們舉乙個例子:
ps:由於詞法分析器通常還要和符號表進行互動,因此屬性值常常作為乙個指標指向符號表中的某個條目。
詞法單元的規約
我們知道,每個詞法單元都有乙個模式來描述它的所有詞素,正規表示式正是這樣一種用來描述詞素模式的重要方法。在真正介紹正規表示式之前,我們還需要了解串和語言以及一些相關的術語和運算,這些內容能幫助我們十分容易地理解正規表示式。
串某個符號集合上的乙個串是該集合中符號的乙個有窮序列。這句話說明了串的兩個特點:第一是組成串的符號都來自某個符號集合,第二是串的長度是可數的。舉個例子:對集合a=來說,它的乙個串只能包括大小寫字母,並且長度是可數的。
下面定義了串上的運算:
語言語言是某個給定的符號集合上乙個任意的可數的串集合。這句話稍微有點抽象,我們把這句話拆分開來解釋:首先,語言是乙個集合;其次,這個集合中的元素是串,並且集合的大小是任意的;最後,這些串是依據某個符號集合生成的。
下面定義了語言上的運算:
正規表示式
正規表示式可以用來描述詞素的模式,乙個正規表示式可以由較小的正規表示式遞迴的構建:
下面我們舉例說明。對於符號集合∑=,有:
- 正規表示式a表示語言;
- 正規表示式a|b表示語言;
- 正規表示式(a|b)(a|b)表示語言;
- 正規表示式a*表示語言;
- 正規表示式(a|b)*表示語言;
- 正規表示式a|a*b表示語言。
上面通過基本的並、連線和閉包運算遞迴定義了正規表示式,為了增強正規表示式描述串模式的能力,也出現了許多針對正規表示式的擴充套件,下面是一些比較典型的擴充套件:
詞法單元的識別
上面介紹了如何用正規表示式來表示乙個模式,下面我們將介紹如何根據詞法單元的模式來識別乙個與該模式匹配的詞素,為此,我們首先將模式轉換成狀態轉換圖。
乙個狀態轉換圖由一組表示狀態的結點和表示輸入字元的邊構成,詞法分析器在掃瞄輸入字串的過程中尋找和某個模式匹配的詞素,狀態轉換圖中的每個狀態代表乙個可能在這個過程中出現的情況。乙個狀態轉換圖有如下特點:
- 有乙個初始狀態,該狀態由一條無出發結點的、標號為「start」的邊指明。在讀入任何輸入符號之前,狀態轉換圖總位於它的初始狀態;
- 有某些最終狀態,該狀態用雙層的圈表示。這些狀態表明已經找到乙個詞素;
- 有某些回退狀態,該狀態附近有乙個「*」標明。在識別「3+4」這個串時,只有當掃瞄到「+」符號時,才能確定前面的數字符號「3」,此時識別出了詞素「3」,並且需要回退乙個字元。
下面是詞法單元relop的狀態轉換圖,它表示比較運算子<、>、<=、>=、<>和=:
編譯原理詞法分析
編譯原理實驗一 詞法分析練習 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 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱...
編譯原理詞法分析
1 注意識別符號和無符號整數的重複問題,本人採用map解決。2 cin ch自動忽略空白字元。include include include include using namespace std struct pairs int isboundaries char ch return 3 case...