設計有窮自動機DFA實現C++簡單程序的詞法分析、掃描(編譯原理實驗)

前面兩篇()只是直觀地針對已明確給出的教學語言 Tiny 源程序進行直接的詞法分析(其實根本就稱不上),不具備通常性(下面這個針對C++源程序的詞法分析也至關單一,考慮面不足)。下面是咱們的課程實驗,須要結合課堂上學到的利用有限自動機DFA的方法來設計並分析源程序,提取出符合要求的Token。ios

根據老師給出的課件以及教材上的內容,掃描程序(詞法分析)有下面3種實現方式,前面兩篇()就是屬於「直接編寫」這一類,而本文則是「DFA」這一類。ide

掃描程序的生成 2011-04-02

  

一、按實驗要求(以下),目前只拙劣地實現了第(1)和(5)點。函數

詞法分析1 2011-03-29

並且第(1)點中有兩個要求未能完成:測試

★ 浮點數,由於包含單行、多行註釋的DFA已經很混亂了,這部分暫時先不實現,考慮未來用「表驅動法」(即狀態轉換表)來實現。spa

★ 註釋,與教材相似不打印單行和多行註釋,所以代碼實現中少了處理註釋的內容。設計

實驗中用到的C++源程序與要求以下圖:3d

詞法分析實驗要求 2011-04-02

 

二、對實驗要求中的「樣例程序」稍微修改了一下。代碼規範

★ 頭文件 #include<iostream.h> 被改成 #include "iostream.h",即 iostream.h 是由雙引號 "" 而不是尖括號 < > 包圍的,實際上回到了 C 的代碼規範。這樣修改是由於本來肯定 DFA 時考慮不全面,忽略了「小於等於 <=,大於等於 >=,判斷 ==,不等於 != 」這幾種特殊狀況,由於他們會跟 < > = ! 這幾個特殊字符形成二義性blog

★ 同時,C++ 中的 IO 有「 >> 與 << 」也可能與上述特殊字符形成歧義,這個使得實現代碼中的 unGetNextChar(int step) 與教材中的有所不一樣,由於該函數帶了一個「步長參數 step」,其實也是爲了遷就 #include&lt;iostream.h> 中的 > 與代碼中的 >> 和 >= 字符串

其實,"iostream.h"也被做爲字符串識別了,目前尚改進不了。

★ 另外爲了測試算術運算符,對實驗要求中的樣例程序進行了修改,程序按照該樣例做爲輸入,以下圖加上了一個「i = i + 2;」語句:

詞法分析2 2011-03-29

 

三、程序中的打印輸出模仿了教材中的樣例輸出。

★ 對於以上樣例輸入,最終程序輸出結果以下:

詞法分析3 2011-03-29

  

四、針對該C++源程序設計的DFA 圖大體以下:

C  簡單程序DFA

  

五、實現代碼(Java)

近來喜歡上了Vim的代碼高亮,看着清晰明朗,下面是整個實現代碼在Vim下的截圖,文本代碼在本文最後:

Scanner源代碼Vim截圖 2011-04-02

相關文章
相關標籤/搜索