【編譯原理】詞法分析程序設計(lex)

編譯原理與技術實驗一

實驗目的:

  1. 掌握詞法分析程序的設計與實現方法
  2. 掌握詞法分析的工作內容

實驗環境:

(1)VMware Workstation 15 Player 虛擬機

(2)Ubuntu 18.04.2 操作系統

實驗內容:

設計並實現c語言的詞法分析程序,要求實現如下功能。

(1)可以識別出用C語言編寫的源程序中的每個單詞符號,並以記號的形式輸出每個單詞符號。

(2)可以識別並跳過源程序中的註釋。

(3)可以統計源程序中的語句行數、各類單詞的個數、以及字符總數,並輸出統計結果。

(4)檢査源程序中存在的詞法錯誤,並報告錯誤所在的位置。

(5)對源程序中出現的錯誤進行適當的恢復,使詞法分析可以繼續進行,對源程序進行一次掃描,即可檢查並報告源程序中存在的所有詞法錯誤。

實現要求:分別用以下兩種方法實現。

方法1:採用C/C++作爲實現語言,手工編寫詞法分析程序。

方法2:編寫LEX源程序,利用LEX編譯程序自動生成詞法分析程序。

本次實驗採用方法2實現。

實驗過程:

打開虛擬機,打開Terminal,輸入命令sudo apt-get install flex安裝flex,flex能將.lex程序解釋成lex.yy.c文件,再輸入命令vim lex.l,開始編輯lex詞法分析程序。

聲明分兩部分,第一部分由「%{」和「%}」包括起來,包含所引用的頭文件,以及用到的全局變量。我用到的全局變量有:行號,單詞數,字符數,關鍵字數,符號數,標識符號。

 

聲明的第二部分定義詞法分析程序要識別的標識符,常數,運算符,關鍵字,分隔符等單詞符號,以及錯誤處理用到的模式,用正則表達式表示。需要注意:「include」,「define」不屬於關鍵字。同時我也考慮了二進制數,八進制數,十六進制數的情況,將其歸入num中。

 

翻譯規則部分,遇到一個單詞,就在相應的統計變量加一,輸出提示信息,同時考慮錯誤處理,我將錯誤分爲四類:第一類是註釋符不匹配,第二類是引號不匹配,第三類是標識符格式錯誤,第四類是在非註釋、非引號部分出現「[email protected]」等符號。第一類第二類錯誤發生了仍要計算行數。

 

輔助過程,定義主函數,要用到Lex提供的函數和變量,參考IBM推出的教程,這裏介紹一下。主函數檢查參數,調用yylex()函數分析源程序,並打印統計信息。

 

 

 

 

 

保存退出,輸入命令vim test.c編寫測試程序test.c

 

編寫測試用的批處理文件show_res.sh,並輸入命令sh show_res.sh運行

 

實驗結果:

 

實驗總結:

本次實驗讓我掌握了詞法分析程序的設計與實現方法,感受到相比用C語言設計,lex程序設計更加便捷。在實驗的過程中對C語言也有了更深入的瞭解。