1. 程式人生 > 實用技巧 >C++原始碼單詞掃描程式(詞法分析)

C++原始碼單詞掃描程式(詞法分析)

實驗內容及要求:

(1)C++原始碼掃描程式識別C++記號。

C++語言包含了幾種型別的記號:識別符號,關鍵字,數(包括整數、浮點數),字串、註釋、特殊符號(分界符)和運算子號等。

(2)開啟一個C++原始檔,打印出所有以上的記號。

(3)要求應用程式應為Windows介面。

(4)選作部分:為了提高C++源程式的可讀性,C++程式在書寫過程中加入了空行、空格、縮排、註釋等。假設你想犧牲可讀性,以節省磁碟空間,那麼你可以存貯一個刪除了所有不必要空格和註釋的C++源程式的壓縮文字。因此,程式中還應該有這樣的壓縮功能。

(5)選作部分:進一步思考或實現——如何進一步實現減小原始檔大小的壓縮功能。

思路:

(1)由於需要處理特殊字元等,因此只能逐個字元掃描;

(2)觀察上述要求的記號:識別符號、關鍵字、數、特殊符號、運算子號(暫時不考慮註釋和字串,比較特殊後面再進行處理),可以發現這些記號幾乎都被特殊符號分割開來了,如空格符、換行符、製表符、逗號、分號等;

(3)分詞: 也就是說我們再逐個字元掃描的時候,若遇到這些特殊字元,要麼就是某個記號的結束,或者記號本身(分號、逗號也是記號,即特殊符號);而我們掃描過程中,正在處理的字元若不是特殊符號,可以暫存起來,直到遇到結束符,然後把之前快取起來的字元組合成一個詞;

(4)型別判斷:經過一輪掃描之後,我們就會得到一個個劃分號的詞,此時再進行記號型別的判斷就容易多了;

(5)當然,除了註釋和字串需要特殊處理外,還有一些特殊字元不一定只有一個位元組,比如(++,--)這些是兩個字元作為一個整體,若按上面進行分詞,這些記號就會被切分開來,不符合要求;這裡我們也可以把無法判斷是否多個位元組的特殊字元快取起來,等到下一個能確定結束的字元再進行處理;

程式執行效果圖: