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