1. 程式人生 > >(編譯原理)C++原始碼單詞掃描程式(詞法分析)

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

實驗內容

1C++原始碼掃描程式識別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)//

由於C++的關鍵字太多,這裡列舉一些常用的關鍵字

String["]({Letter}|{Nat})*["]//字串

Identifier {Letter}+//識別符號

Special#|<|<[<=>]|>|>[=>]|"["|"]"|"{"|"}"|!|!=|"("|")"|=|==|".";

//由於C++的特殊符號太多,這裡列舉一些常用的特殊符號

Whitespace \n|[\t]+//換行符號和製表符

2、編寫輸入檔案

Lex輸入檔案如下:


3.Linux下編譯連結執行結果並生成txt檔案如下:


4.Windows下使用VC6.0lex.yy.c檔案進行編譯連結結果如下:


5.開啟txt檔案檢視壓縮功能,基本上實現了刪除所有不必要空格和註釋的C++源程式的壓縮文字功能