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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論