天天看點

自己動手構造編譯系統:編譯、彙編與連結2.1.1 詞法分析

<b>2.1.1  詞法分析</b>

  

      編譯器工作之前,需要将用進階語言書寫的源程式作為輸入。為了便于了解,我們使用c語言的一個子集定義進階語言,本書後續章節的例子都會使用c語言的一些基本文法作為示例。現在假定我們擁有一段使用c語言書寫的源程式,詞法分析器通過對源檔案的掃描獲得進階語言定義的詞法記号。所謂詞法記号(也稱為終結符),反映在進階語言文法中就是對應的辨別符、關鍵字、常量,以及運算符、逗号、分号等界符。見圖2-2。

  例如語句:

var2=var1+100;

   該語句包含了6個詞法記号,它們分别是:“var2”“=”“var1”“+”“100”和分号。

  對詞法分析器的要求是能正常識别出這些不同形式的詞法記号。詞法分析器的輸入是源代碼文本檔案内一長串的文本内容,那麼如何從文本串中分析出每個詞法記号呢?為了解決這個問題,需要引入有限自動機的概念。

  有限自動機能解析并識别詞法記号,比如識别辨別符的有限自動機、識别常量的有限自動機等。有限自動機從開始狀态啟動,讀入一個字元作為輸入,并根據該字元選擇進入下一個狀态。繼續讀入新的字元,直到遇到結束狀态為止,讀入的所有字元序列便是有限自動機識别的詞法記号。

  圖2-3描述了識别辨別符的有限自動機。c語言辨別符的定義是:一個不以數字開始的由下劃線、數字、字母組成的非空字元串。圖中的自動機從0号狀态開始,讀入一個下劃線或者字母進入狀态1,狀态1可以接受任意數量的下劃線、字母和數字,同時狀态1也是結束狀态,一旦它讀入了其他異常字元便停止自動機的識别,這樣就可以識别任意一個合法的辨別符。如果在非結束狀态讀入了異常的字元,意味着發生了詞法錯誤,自動機停止(當然,上述辨別符的有限自動機不會出現錯誤的情況)。

圖2-3  辨別符有限自動機

  我們以指派語句“var2=var1+100;” 中的變量var2為例來說明有限自動機識别詞法記号的工作過程。

  識别var2的自動機狀态序列和讀入字元的對應關系如表2-1所示,結束狀态之前識别的字元序列即為合法的辨別符。

  使用有限自動機,可以識别出自定義語言包含的所有詞法記号。把這些詞法記号記錄下來,作為下一步文法分析的輸入。如果使用一遍編譯方式,就不用記錄這些詞法記号,而是直接将識别的詞法記号送入文法分析器進行處理。

繼續閱讀