已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
洛陽(yáng)理工學(xué)院實(shí)驗(yàn)報(bào)告院部計(jì)算機(jī)系班級(jí)B150402學(xué)號(hào)姓名課程名稱編譯原理實(shí)驗(yàn)日期2018.6.4實(shí)驗(yàn)名稱詞法分析器成績(jī)實(shí)驗(yàn)?zāi)康模杭由顚?duì)詞法分析過(guò)程的理解;加強(qiáng)對(duì)詞法分析方法的掌握;能夠采用一種編程語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的詞法分析;能夠使自己編寫的程序?qū)?jiǎn)單的程序片段進(jìn)行詞法分析。實(shí)驗(yàn)條件:裝有Windows操作系統(tǒng),Microsoft Visual C+ 6.0。實(shí)驗(yàn)內(nèi)容:自定義一種程序設(shè)計(jì)語(yǔ)言,或選擇已有的一種高級(jí)語(yǔ)言(C語(yǔ)言),編制它的詞法分析程序。實(shí)驗(yàn)要求:1.對(duì)單詞的構(gòu)成規(guī)則有明確的定義2.編寫的程序能夠正確識(shí)別源程序中的單詞符號(hào)3.識(shí)別出的單詞以的形式保存在符號(hào)表中4.詞法分析中源程序和分析后的符號(hào)表均保存在.txt文件中5.有一定的檢查錯(cuò)誤的能力。遇到錯(cuò)誤時(shí)可顯示“Error”,然后跳過(guò)錯(cuò)誤部分繼續(xù)顯示。6. 實(shí)驗(yàn)報(bào)告包括以下內(nèi)容(1)編程思路、流程圖、源代碼(2)上機(jī)調(diào)試時(shí)發(fā)現(xiàn)的問(wèn)題,以及解決的過(guò)程(3)所使用的測(cè)試數(shù)據(jù)及結(jié)果(4)心得體會(huì)實(shí)驗(yàn)步驟1.給出目標(biāo)語(yǔ)言的所有單詞符號(hào)及種別編碼、單詞符號(hào)的狀態(tài)轉(zhuǎn)換圖。2.依次讀入源程序,對(duì)源程序進(jìn)行單詞切分和識(shí)別,直到源程序結(jié)束。3.對(duì)正確的單詞,按照它的種別以的形式保存在符號(hào)表中。4.對(duì)不正確的單詞,做出錯(cuò)誤處理。實(shí)驗(yàn)內(nèi)容:1.編程思路:1.1、實(shí)現(xiàn)預(yù)處理功能源程序中可能包含有對(duì)程序執(zhí)行無(wú)意義的符號(hào),要求將其剔除。首先編制一個(gè)源程序的輸入過(guò)程,從鍵盤、文件或文本框輸入若干行語(yǔ)句,依次存入輸入緩沖區(qū)(字符型數(shù)據(jù));然后編制一個(gè)預(yù)處理子程序,去掉輸入串中的回車符、換行符和跳格符等編輯性文字;把多個(gè)空白符合并為一個(gè);去掉注釋。 1.2、實(shí)現(xiàn)詞法分析功能輸入:所給文法的源程序字符串。輸出:將每個(gè)單詞或數(shù)字以及他對(duì)應(yīng)的種別碼和類型輸出到文件中。具體實(shí)現(xiàn)時(shí),可以將單詞的二元組用結(jié)構(gòu)進(jìn)行處理。1.3、待分析的C語(yǔ)言子集的詞法1)關(guān)鍵字 char,int,if,else,var ,return,break,do,while,for,double,float,short2)運(yùn)算符和界符 + - * / = = ; ( ) | & #3)空格由空白、制表符和換行符組成空格一般用來(lái)分隔ID、NUM、專用符號(hào)和關(guān)鍵字,詞法分析階段通常被忽略。1.4、各種單詞符號(hào)對(duì)應(yīng)的種別碼表1 各種單詞符號(hào)的種別碼單詞符號(hào)種別碼char1int2if3else4var5return6break7do8while9for10double11float12short13標(biāo)識(shí)符14數(shù)字15符號(hào)16-401.5、 詞法分析程序的主要算法思想算法的基本任務(wù)是從文件中讀出字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到的單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào),并輸出到文件中。2.流程圖:2.1主程序流程圖是否輸入串結(jié)束輸入編譯后的文件名調(diào)用分析子程序結(jié)束開始輸入打開的文件名關(guān)閉文件文件為空?是輸入串結(jié)束是主函數(shù)流程圖2.2分析函數(shù)流程圖否否是否是符號(hào)字母數(shù)字否是返回0變量初始化忽略空格是否文件結(jié)束獲取一個(gè)單詞獲取數(shù)字在文件中寫入當(dāng)前單詞以及對(duì)應(yīng)的關(guān)鍵字種別碼獲取一個(gè)完整符號(hào)返回開始在文件中寫入當(dāng)前單詞以及對(duì)應(yīng)的符號(hào)種別碼在文件中寫入當(dāng)前單詞以及對(duì)應(yīng)的符號(hào)種別碼在文件中寫入當(dāng)前單詞以及標(biāo)識(shí)符種別碼12將當(dāng)前單詞添加到標(biāo)識(shí)符表中存在于數(shù)字表存在于標(biāo)識(shí)符表存在于符號(hào)表存在于關(guān)鍵字表是將當(dāng)前數(shù)字添加到數(shù)字表中將當(dāng)前符號(hào)添加到符號(hào)表中是分析函數(shù)流程圖3.源代碼:#include#include#include#include#includeint i, row = 0, line = 0;char a1000; /程序int number1000100; /常數(shù)表char mark1005; /標(biāo)識(shí)符表FILE *fin,*fout;/詞法分析int wordanalysis() if (ai = A&ai =a&ai= A&ai = 0 & ai =a&ai=z) wordn+ = ai+; wordn = 0; i-; /判斷該標(biāo)識(shí)符是否為關(guān)鍵字 for (n = 0; n 100; n+) if (strcmp(word, keyWordn) = 0) fprintf(fout,%st(%d)t關(guān)鍵字n, keyWordn, n + 1); return 3; /判斷該標(biāo)識(shí)符是否存在標(biāo)識(shí)符表中 int m = 0; if (line != 0) int q = 0; while (q= 0 & ai = 0 & ai = 9) xn+ = ai+; xn = 0; i-; int num = atoi(x); /將字符串轉(zhuǎn)換成int型 /判斷該常數(shù)是否存在于常數(shù)表中 if (row != 0) int y; for (y = 0; y 1000; y+) int w = numbery0; sum = 0; int d; for (d = 1; d 0; n-) /將二進(jìn)制保存于常數(shù)表中 numberrown = c % 2; c = c / 2; numberrow0 = m; int line = row; fprintf(fout,%dt(15,%d)n, num, line + 1); row+; return 3; else /分析符號(hào) switch (ai) case : case n: return -1; case #: return 0; case =:fprintf(fout,=t(16)n); return 3; case : i+; if (ai = =) fprintf(fout,) fprintf(fout,t(18)n); return 3; else i-; fprintf(fout,: i+; if (ai = =) fprintf(fout,=t(20)n); return 3; else i-; fprintf(fout,t(21)n); return 3; case +: fprintf(fout,+t(22)n); return 3; case -: fprintf(fout,-t(23)n); return 3; case *: fprintf(fout,*t(24)n); return 3; case /: i+; if(ai!=/) i-; fprintf(fout,/t(25)n); return 3; else while(1) if(ai+=n) return -1; fprintf(fout,/t(35)n);return 3; case : fprintf(fout,:t(26)n); return 3; case ;: fprintf(fout,;t(27)n); return 3; case (: fprintf(fout,(t(28)n); return 3; case ): fprintf(fout,)t(29)n); return 3; case : fprintf(fout,t(30)n); return 3; case : fprintf(fout,t(31)n); return 3; case : fprintf(fout,t(32)n); return 3; case : fprintf(fout,t(33)n); return 3; case |: fprintf(fout,|t(34)n); return 3; case : fprintf(fout,t(35)n);return 3; case ,: fprintf(fout,t(36)n); return 3; case : fprintf(fout,t(37)n); return 3;/單引號(hào) case &: i+; if(ai!=&) i-; fprintf(fout,&t(38)n); return 3; else fprintf(fout,&t(39)n);return 3; case : fprintf(fout,t(40)n); return 3; int main()printf(*C語(yǔ)言實(shí)現(xiàn)編譯原理詞法分析器*nn);printf(n); int l = 0;int m; i = 0;char input100,output100;/輸入文件和輸出文件的路徑和文件名 printf(請(qǐng)輸入詞法分析輸入的文件名(包括路徑):);scanf(%s,input);printf(請(qǐng)輸入詞法分析輸出的文件名(包括路徑):);scanf(%s,output);fin=fopen(input,r);fout=fopen(output,w);if(fin=NULL)printf(打開詞法分析輸入文件有錯(cuò)n);return(1);if(fout=NULL)printf(打開詞法分析輸出文件有錯(cuò)n);return(2);/返回錯(cuò)誤代碼2printf(n-開始進(jìn)行詞法分析-n); while (!feof(fin) al+ = fgetc(fin); al = #; do m = wordanalysis(); switch (m) case -1:i+; break; case 0: i+; break; case 3: i+; break; while (m != 0);fclose(fin); fclose(fout); printf(n-詞法分析執(zhí)行完畢-n); _getch(); return 0;4.上機(jī)調(diào)試時(shí)發(fā)現(xiàn)的問(wèn)題,以及解決的過(guò)程:1)文件讀取錯(cuò)誤。運(yùn)行程序后,輸入文件路徑后,顯示“打開詞法分析輸入文件有錯(cuò)”。解決:我看了下程序,沒發(fā)現(xiàn)什么明顯錯(cuò)誤,然后看了文件名111.txt,也是對(duì)的,點(diǎn)開文件屬性,發(fā)現(xiàn)文件名顯示的是111.txt.txt,意識(shí)到機(jī)房電腦默認(rèn)沒顯示后綴,自己起名字的時(shí)候多加了一個(gè).txt;2)運(yùn)行過(guò)程中強(qiáng)行停止。解決:檢查了一下程序,發(fā)現(xiàn)關(guān)鍵字表數(shù)組下標(biāo)溢出,后來(lái)改了循環(huán)的條件。3)運(yùn)行不能正常停止。解決:MS-DOS命令窗口未關(guān)閉的時(shí)候,檢查輸出文件是否存在,發(fā)現(xiàn)存在但是打開為空,然后關(guān)閉運(yùn)行窗口后再打開發(fā)現(xiàn)輸出結(jié)果已經(jīng)寫入了文件,只是沒有執(zhí)行fclose()所以打開后看不到內(nèi)容。4)某些關(guān)鍵字被作為標(biāo)識(shí)符輸出。解決:檢查程序發(fā)現(xiàn)關(guān)鍵字表不夠完整,所以不能輸出不存在于關(guān)鍵字表中的種別碼,然后完善了關(guān)鍵字表。5)單詞、數(shù)字、符號(hào)重復(fù)出現(xiàn)時(shí),序號(hào)不一致。解決:增加了一個(gè)標(biāo)識(shí)符表、數(shù)字表以及符號(hào)表,判斷過(guò)詞性時(shí),先判
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版汽車售后服務(wù)銷售提成協(xié)議2篇
- 軟件系統(tǒng)采購(gòu)合同
- 租賃合同機(jī)械設(shè)備租賃合同
- 代理銷售的合同范本
- 采購(gòu)協(xié)議書和采購(gòu)合同范文
- 二零二五年度并購(gòu)基金股權(quán)收購(gòu)協(xié)議示范文本3篇
- 二零二五版休閑農(nóng)業(yè)示范園區(qū)土地承包協(xié)議書3篇
- 二零二五年度企業(yè)內(nèi)部員工提成獎(jiǎng)勵(lì)協(xié)議樣本3篇
- 正規(guī)勞務(wù)派遣合同范本
- 二零二五版物流園區(qū)柴油發(fā)電機(jī)組供應(yīng)與環(huán)保協(xié)議3篇
- 粘液腺肺癌病理報(bào)告
- 巡察檔案培訓(xùn)課件
- 酒店人防管理制度
- 油田酸化工藝技術(shù)
- 上海高考英語(yǔ)詞匯手冊(cè)列表
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)五 其他內(nèi)容類型的生產(chǎn)
- 上海石油化工股份有限公司6181乙二醇裝置爆炸事故調(diào)查報(bào)告
- 家譜人物簡(jiǎn)介(優(yōu)選12篇)
- 例說(shuō)相機(jī)誘導(dǎo)在語(yǔ)文教學(xué)中的運(yùn)用 相機(jī)誘導(dǎo)
- 浙江省紹興市2023年中考科學(xué)試題(word版-含答案)
- 《核心素養(yǎng)下初中足球教學(xué)研究3700字(論文)》
評(píng)論
0/150
提交評(píng)論