词法分析器c语言带注释,C语言词法分析器内容说明注释完整可运行代码.doc-资源下载在线文库www.lddoc.cn...
C語言詞法分析器_內容說明注釋完整_可運行代碼.doc
1. 實驗目的及要求 本次實驗通過用 C 語言 設計、編制、調試一個詞法分析子程序,識別單詞,實現一個 C 語言詞法分析器,經過此過程可以加深對編譯器解析單詞流的過程的了解。 運行環境運行環境 硬件windows xp 軟件visual c6.0 2. 實驗步驟 1.查詢資料,了解詞法分析器的工作過程與原理。 2.分析題目,整理出基本設計思路。 3.實踐編碼,將設計思想轉換用 c 語言編碼實現,編譯運行。 4.測試功能,多次設置包含不同字符,關鍵字的待解析文件,仔細察看運行結果,檢測該分 析器的分析結果是否正確。 通過最終的測試發現問題, 逐漸完善代碼中設置的分析對象與關 鍵字表,拓寬分析范圍提高分析能力。 3. 實驗內容 本實驗中將 c 語言單詞符號分成了四類關鍵字 key(特別的將 main 說明為主函數) 、 普通標示符、常數和界符。將關鍵字初始化在一個字符型指針數組*key中,將界符分別由 程序中的 case 列出。在詞法分析過程中,關鍵字表和case 列出的界符的內容是固定不變的 (由程序中的初始化確定) ,因此,從源文件字符串中識別出現的關鍵字,界符只能從其中 選取。標識符、常數是在分析過程中不斷形成的。 對于一個具體源程序而言, 在掃描字符串時識別出一個單詞, 若這個單詞的類型是關鍵 字、普通標示符、常數或界符中之一,那么就將此單詞以文字說明的形式輸出每次調用詞 法分析程序,它均能自動繼續掃描下去,形成下一個單詞,直到整個源程序全部掃描完畢, 從而形成相應的單詞串。 輸出形式例如void 關鍵字 流程圖流程圖 、程序、程序 流程圖 開始 輸入源文 件路徑 路徑是否有 效 是 初始化文件指針 否 將字符加入字符數 組Word 是空格,空白或換 行嗎 是字母嗎是數字嗎否否是界符嗎否 打開源文件 跳過該字符 是 是 文件結束 否 將字符加入字符數 組Word 否 將字符 加入字 符數組 Word 是 指向下一字符 識別指針內容 指向下一字符 是字母惑數字 嗎 是 將word與關鍵 字表key進行匹 配 否 匹配 是 輸出word 為關鍵字 輸出word為 普通標示符 否 將字符加 入字符數 組Word 指向下一字符 輸出word 為常數 識別指針內容 回退 是數字嗎 是 否 輸出word 為界符 指向下一字符 結束是 輸出Word 內容為不 可識別 將字符 加入字 符數組 Word 程序 include include include include 定義關鍵字 char *Key10“main“,“void“,“int“,“char“,“printf“,“scanf“,“else“,“if“,“return“; char Word20,ch; 存儲識別出的單詞流 int IsAlphachar c 判斷是否為字母 ifcacA return 1; else return 0; int IsNumchar c 判斷是否為數字 ifc0 else return 0; int IsKeychar *Word 識別關鍵字函數 int m,i; fori0;i9;i ifmstrcmpWord,Keyi0 ifi0 return 2; return 1; return 0; void scannerFILE *fp 掃描函數 char Word200 int i,c; chfgetcfp; 獲取字符,指針 fp 并自動指向下一個字符 ifIsAlphach 判斷該字符是否是字母 Word0ch; chfgetcfp; i1; whileIsNumchIsAlphach 判斷該字符是否是字母或數字 Wordich; i; chfgetcfp; Wordi00 代表字符結束空格 fseekfp,-1,1; 回退一個字符 cIsKeyWord; 判斷是否是關鍵字 ifc0 printf“st普通標識符nn“,Word;不是關鍵字 else ifc2 printf“st主函數nn“,Word; else printf“st關鍵字nn“,Word; 輸出關鍵字 else 開始判斷的字符不是字母 ifIsNumch 判斷是否是數字 Word0ch; chfgetcfp; i1; whileIsNumch Wordich; i; chfgetcfp; Wordi0 快快快快快快快快可 回退 printf“st無符號實數nn“,Word; else 開始判斷的字符不是字母也不是數字 Word0ch; switchch case case case case case case case, case“ caseprintf“st界符nn“,Word; break; casechfgetcfp; Word1ch; ifch printf“st運算符nn“,Word;運算符“” else ifch printf“st運算符nn“,Word; 判斷結果為“” else fseekfp,-1,1; printf“st運算符nn“,Word; 判斷結果為“” break; case-chfgetcfp; Word1ch; ifch printf“st運算符nn“,Word; else ifch- printf“st運算符nn“,Word; 判斷結果為“” else fseekfp,-1,1; printf“st運算符nn“,Word; 判斷結果為“-” break; case* case/ case casechfgetcfp; ifch printf“st運算符nn“,Word; else fseekfp,-1,1; printf“st運算符nn“,Word; break; casechfgetcfp; Word1ch; ifch printf“st運算符nn“,Word; 判斷結果為運算符 “” else ifch printf“st運算符nn“,Word; 判斷結果為“” else fseekfp,-1,1; printf“st運算符nn“,Word; 判斷結果為“chfgetcfp; Word1ch; ifch printf“st運算符nn“,Word; else fseekfp,-1,1; printf“st運算符nn“,Word; break; casechfgetcfp; Word1ch; ifchprintf“st運算符nn“,Word; ifIsAlphach printf“st類型標識符nn“,Word; else fseekfp,-1,1; printf“st取余運算符nn“,Word; break; defaultprintf“無法識別字符nn“; break; main char in_fn30; 文件路徑 FILE *fp; printf“n 請輸入源文件名(包括路徑和后綴名)“; while1 getsin_fn; scanf“s“,in_fn; iffpin_fn,“r“NULL break; 讀取文件內容,并返回文件指針,該 指針指向文件的第一個字符 else printf“文件路徑錯誤請重新輸入“; printf“n* 詞法分析結果如下 *n“; do chfgetcfp; ifch break; 文件以結尾,作為掃描結束條件 else ifch chtchn 忽略空格,空白,和換行 else fseekfp,-1,1; 回退一個字節開始識別單詞流 scannerfp; whilech; return0; 4.實驗結果 解析源文件 void main int a3; ab; printf“d“,a; return; 解析結果 5.實驗總結分析 通過本次實驗,讓再次瀏覽了有關 c 語言的一些基本知識,特別是對文件,字符串進行 基本操作的方法。C 語言中沒有 string 類型,因此本實驗中的對字符串提取與識別均借助 include及字符型數組來實現。 讓我練習對字符串函數應用的同時也提高了自己 的邏輯思維能力。 在本次實驗中,我糾正了一個一直以來的概念錯誤main 不是關鍵字,它定義為程序 的入口,是主函數在本實驗中,雖然我把 main 初始化在關鍵字表 (字符指針類型數組)*Key10中,當與該數組中字符串進行比較時,若與 main 匹配成功, 則返回 2,若為其他關鍵字則返回 1,以此來把 main 從關鍵字中區別出來。 在本實驗中的關鍵字表只初始化了幾個常用的關鍵字, 還可繼續擴充 (只需擴大數組, 向其中補充要添加的關鍵字) 。 如果要對本程序中未識別的 c 語言中的一些其他的字符進行擴充(目前處理為不可識別字 符) ,可在程序代碼中繼續添加 case 選項,分別對相應要識別的特殊字符加以描述
總結
以上是生活随笔為你收集整理的词法分析器c语言带注释,C语言词法分析器内容说明注释完整可运行代码.doc-资源下载在线文库www.lddoc.cn...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡分期能提额吗 提额技巧看这里
- 下一篇: 信用卡分期能取消吗 提前还款是终结分期的