實驗一、詞法分析器(含源代碼)_第1頁
實驗一、詞法分析器(含源代碼)_第2頁
實驗一、詞法分析器(含源代碼)_第3頁
實驗一、詞法分析器(含源代碼)_第4頁
實驗一、詞法分析器(含源代碼)_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

詞法分析器實驗報告 一 實驗?zāi)康募耙?本次實驗通過用 C 語言 設(shè)計 編制 調(diào)試一個詞法分析子程序 識別單詞 實現(xiàn)一個 C 語言詞法分析器 經(jīng)過此過程可以加深對編 譯器解析單詞流的過程的了解 運(yùn)行環(huán)境運(yùn)行環(huán)境 硬件 windows xp 軟件 visual c 6 0 二 實驗步驟 1 查詢資料 了解詞法分析器的工作過程與原理 2 分析題目 整理出基本設(shè)計思路 3 實踐編碼 將設(shè)計思想轉(zhuǎn)換用 c 語言編碼實現(xiàn) 編譯運(yùn)行 4 測試功能 多次設(shè)置包含不同字符 關(guān)鍵字的待解析文件 仔細(xì) 察看運(yùn)行結(jié)果 檢測該分析器的分析結(jié)果是否正確 通過最終的測 試發(fā)現(xiàn)問題 逐漸完善代碼中設(shè)置的分析對象與關(guān)鍵字表 拓寬分 析范圍提高分析能力 三 實驗內(nèi)容 本實驗中將 c 語言單詞符號分成了四類 關(guān)鍵字 key 特別的將 main 說明為主函數(shù) 普通標(biāo)示符 常數(shù)和界符 將關(guān)鍵字初始化 在一個字符型指針數(shù)組 key 中 將界符分別由程序中的 case 列出 在詞法分析過程中 關(guān)鍵字表和 case 列出的界符的內(nèi)容是固定不變 的 由程序中的初始化確定 因此 從源文件字符串中識別出現(xiàn)的 關(guān)鍵字 界符只能從其中選取 標(biāo)識符 常數(shù)是在分析過程中不斷 形成的 對于一個具體源程序而言 在掃描字符串時識別出一個單詞 若這個單詞的類型是關(guān)鍵字 普通標(biāo)示符 常數(shù)或界符中之一 那 么就將此單詞以文字說明的形式輸出 每次調(diào)用詞法分析程序 它 均能自動繼續(xù)掃描下去 形成下一個單詞 直到整個源程序全部掃 描完畢 從而形成相應(yīng)的單詞串 輸出形式例如 void 關(guān)鍵字 流程圖流程圖 程序 程序 流程圖 開始 輸入源文 件路徑 路徑是否有 效 是 初始化文件指針 否 將字符加入字符數(shù) 組Word 是空格 空白或換 行嗎 是字母嗎是數(shù)字嗎否否是界符嗎否 打開源文件 跳過該字符 是 是 文件結(jié)束 否 將字符加入字符數(shù) 組Word 否 將字符 加入字 符數(shù)組 Word 是 指向下一字符 識別指針內(nèi)容 指向下一字符 是字母惑數(shù)字 嗎 是 將word與關(guān)鍵 字表key進(jìn)行匹 配 否 匹配 是 輸出word 為關(guān)鍵字 輸出word為 普通標(biāo)示符 否 將字符加 入字符數(shù) 組Word 指向下一字符 輸出word 為常數(shù) 識別指針內(nèi)容 回退 是數(shù)字嗎 是 否 輸出word 為界符 指向下一字符 結(jié)束是 輸出Word 內(nèi)容為不 可識別 將字符 加入字 符數(shù)組 Word 程序 include include include include 定義關(guān)鍵字 char Key 10 main void int char printf scanf else if return char Word 20 ch 存儲識別出的單詞流 int IsAlpha char c 判斷是否為字母 if c a c A return 1 else return 0 int IsNum char c 判斷是否為數(shù)字 if c 0 else return 0 int IsKey char Word 識別關(guān)鍵字函數(shù) int m i for i 0 i 9 i if m strcmp Word Key i 0 if i 0 return 2 return 1 return 0 void scanner FILE fp 掃描函數(shù) char Word 20 0 char ch int i c ch fgetc fp 獲取字符 指針 fp 并自動指向下一個字符 if IsAlpha ch 判斷該字符是否是字母 Word 0 ch ch fgetc fp i 1 while IsNum ch IsAlpha ch 判斷該字符是否是字母或數(shù)字 Word i ch i ch fgetc fp Word i 0 0 代表字符結(jié)束 空格 fseek fp 1 1 回退一個字符 c IsKey Word 判斷是否是關(guān)鍵字 if c 0 printf s t 普通標(biāo)識符 n n Word 不是關(guān)鍵字 else if c 2 printf s t 主函數(shù) n n Word else printf s t 關(guān)鍵字 n n Word 輸出關(guān)鍵字 else 開始判斷的字符不是字母 if IsNum ch 判斷是否是數(shù)字 Word 0 ch ch fgetc fp i 1 while IsNum ch Word i ch i ch fgetc fp Word i 0 fseek fp 1 1 回退 printf s t 無符號實數(shù) n n Word else 開始判斷的字符不是字母也不是數(shù)字 Word 0 ch switch ch case case case case case case case case case printf s t 界符 n n Word break case ch fgetc fp Word 1 ch if ch printf s t 運(yùn)算符 n n Word 運(yùn)算符 else if ch printf s t 運(yùn)算符 n n Word 判斷結(jié)果為 else fseek fp 1 1 printf s t 運(yùn)算符 n n Word 判斷結(jié)果為 break case ch fgetc fp Word 1 ch if ch printf s t 運(yùn)算符 n n Word else if ch printf s t 運(yùn)算符 n n Word 判斷結(jié)果為 else fseek fp 1 1 printf s t 運(yùn)算符 n n Word 判斷結(jié)果為 break case case case case ch fgetc fp if ch printf s t 運(yùn)算符 n n Word else fseek fp 1 1 printf s t 運(yùn)算符 n n Word break case ch fgetc fp Word 1 ch if ch printf s t 運(yùn)算符 n n Word 判斷結(jié)果為運(yùn)算符 else if ch printf s t 運(yùn)算符 n n Word 判斷結(jié)果為 else fseek fp 1 1 printf s t 運(yùn)算符 n n Word 判斷結(jié)果為 ch fgetc fp Word 1 ch if ch printf s t 運(yùn)算符 n n Word else fseek fp 1 1 printf s t 運(yùn)算符 n n Word break case ch fgetc fp Word 1 ch if ch printf s t 運(yùn)算符 n n Word if IsAlpha ch printf s t 類型標(biāo)識符 n n Word else fseek fp 1 1 printf s t 取余運(yùn)算符 n n Word break default printf 無法識別字符 n n break main char in fn 30 文件路徑 FILE fp printf n 請輸入源文件名 包括路徑和后綴名 while 1 gets in fn scanf s in fn if fp fopen in fn r NULL break 讀取文件內(nèi)容 并返回文件指針 該 指針指向文件的第一個字符 else printf 文件路徑錯誤 請重新輸入 printf n 詞法分析結(jié)果如下 n do ch fgetc fp if ch break 文件以 結(jié)尾 作為掃描結(jié)束條件 else if ch ch t ch n 忽略空格 空白 和換行 else fseek fp 1 1 回退一個字節(jié)開始識別單詞流 scanner fp while ch return 0 4 實驗結(jié)果 解析源文件 void main int a 3 a b printf d a return 解析結(jié)果 5 實驗總結(jié)分析 通過本次實驗 讓再次瀏覽了有關(guān) c 語言的一些基本知識 特別是對文件 字符串進(jìn) 行基本操作的方法 C 語言中沒有 string 類型 因此本實驗中的對字符串提取與識別均借 助 include及字符型數(shù)組來實現(xiàn) 讓我練習(xí)對字符串函數(shù)應(yīng)用的同時也提高了 自己的邏輯思維能力 在本次實驗中 我糾正了一個一直以來的概念錯誤 main 不是關(guān)鍵字 它定義為程 序的入口 是主函數(shù) 在本實驗中 雖然我把 main 初始化在關(guān)鍵字表 字符指針類型數(shù)組 Key 10 中 當(dāng)與該數(shù)組中字符串進(jìn)行比較時

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論