(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語言也有了更深入的瞭解。