(編譯原理)C++原始碼單詞掃描程式(詞法分析)
實驗內容
(1)C++原始碼掃描程式識別C++記號。 C++語言包含了幾種型別的記號:識別符號,關鍵字,數(包括整數、浮點數),字串、註釋、特殊符號(分界符)和運算子號等。
(2)開啟一個C++原始檔,打印出所有以上的記號。
(3)選作部分:為了提高c++源程式的可讀性,C++程式在書寫過程中加入了空行、空格、縮排、註釋等。假設你想犧牲可讀性,以節省磁碟空間,那麼你可以存貯一個刪除了所有不必要空格和註釋的C++源程式的壓縮文字。因此,程式中還應該有這樣的壓縮功能。
(4)選作部分:進一步思考或實現——如何進一步實現減少原始檔大小的壓縮功能。
(6)應該書寫完善的軟體文件。
二、實驗裝置
作業系統:Windows7或者linux
軟體:VC6.0、Lex掃描程式生成器
三、實驗步驟
1、寫出識別符號,關鍵字,數(包括整數、浮點數),字串、註釋、特殊符號(分界符)和運算子號的正則表示式,結果如下:
Letter [a-z|A-Z]//字母
Nat [0-9]+//數字
All ({Letter}|{Number}|{OP}|{String}|{Special}|[])*//包含實驗要求的正則表示式
Number {Nat}("."{Nat})?//數(整數、浮點數)
Note"//"{All}|"/*"{All}"*/"//註釋
OP"+"|"-"|"*"|%|"/"|"^"|"|"//運算子號
Keyword(include|define|iostream.h|int|float|double|main|if|else|for|while|do|switch|case|static|cin|cout|void|return)//
String["]({Letter}|{Nat})*["]//字串
Identifier {Letter}+//識別符號
Special#|<|<[<=>]|>|>[=>]|"["|"]"|"{"|"}"|!|!=|"("|")"|=|==|".";
//由於C++的特殊符號太多,這裡列舉一些常用的特殊符號
Whitespace \n|[\t]+//換行符號和製表符
2、編寫輸入檔案
Lex輸入檔案如下:
3.Linux下編譯連結執行結果並生成txt檔案如下:
4.Windows下使用VC6.0將lex.yy.c檔案進行編譯連結結果如下:
5.開啟txt檔案檢視壓縮功能,基本上實現了刪除所有不必要空格和註釋的C++源程式的壓縮文字功能。