




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)科學(xué)與工程系編譯原理課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告姓名:_ *_ 學(xué)號(hào)_ *_ 年級(jí)專(zhuān)業(yè)及班級(jí)_08計(jì)算機(jī)科學(xué)與技術(shù) 成績(jī) 實(shí)驗(yàn)名稱(chēng)詞法分析程序設(shè)計(jì)與實(shí)現(xiàn)完成日期2011/4/12指導(dǎo)教師*實(shí)驗(yàn)?zāi)康模耗軌虿捎肅編程語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的詞法分析程序;設(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解實(shí)驗(yàn)要求: 1. 對(duì)單詞的構(gòu)詞規(guī)則有明確的定義;2. 編寫(xiě)的分析程序能夠正確識(shí)別源程序中的單詞符號(hào); 3. 識(shí)別出的單詞以的形式保存在符號(hào)表中(鏈表);4. 詞法分析中源程序的輸入以.c格式,分析后的符號(hào)表,將二元組保存在.txt文件中。實(shí)驗(yàn)內(nèi)容:選擇高級(jí)語(yǔ)言(C語(yǔ)言),編制它的詞法分析程序。詞法分析程序的
2、實(shí)現(xiàn)可以采用任何一種編程工具實(shí)驗(yàn)原理:1、算法的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào);2、其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類(lèi),拼出相應(yīng)的單詞符號(hào)。 實(shí)驗(yàn)分析:(1)關(guān)鍵字:if else while do case int break等所有的關(guān)鍵字都是小寫(xiě)。(2)運(yùn)算符和界符: = + - * / = = = ; ( ) 等(3)其他單詞是標(biāo)識(shí)符(ID)和整型常數(shù)(SUM),通過(guò)以下正規(guī)式定義:ID = _ | letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和換行符組成??崭褚话阌脕?lái)分隔ID、S
3、UM、運(yùn)算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。 (5)注釋被忽略(6)各種單詞符號(hào)對(duì)應(yīng)的種別碼(如下):?jiǎn)卧~符號(hào)種別碼單詞符號(hào)種別碼auto1double2int3struct4break5else6long7switch8case9enum10register11typedef12char13extern14return15union16const17float18short19unsigned20continue21for22signed23void24default25goto26sizeof27volatile28do29while30static31if32a33b34f35n
4、36t37v3839?4041”42043ddd44 xhh45數(shù)字46標(biāo)識(shí)符47#48(49)505152535455*56:5758%5960+61?62=63|64&65!6668=69=7071!=7273&7481“82%A(A可為dsc)83;84_85/868788899091其他類(lèi)別99實(shí)驗(yàn)流程圖(由于流程圖過(guò)大因此各部分分開(kāi)寫(xiě)):整體:掃描注釋?zhuān)簰呙钄?shù)字:掃描引號(hào):掃描單詞:掃描其他字符:實(shí)驗(yàn)環(huán)境:需要TC、VC+ 6.0等開(kāi)發(fā)工具作為本次試驗(yàn)的環(huán)境。實(shí)驗(yàn)步驟:1、準(zhǔn)備: 用TC、VC+等開(kāi)發(fā)工具;2、對(duì)本實(shí)驗(yàn)的任務(wù)進(jìn)行分析,確定實(shí)現(xiàn)功能的函數(shù);3、寫(xiě)好程序,仔細(xì)修改函數(shù);4
5、、上機(jī)操作:輸入源程序,修改、調(diào)試,運(yùn)行。5、寫(xiě)好試驗(yàn)報(bào)告。實(shí)驗(yàn)調(diào)試過(guò)程及測(cè)試結(jié)果/*源代碼*/#include#include#include #includevoid main()FILE *fp,*fp1;int hanjsq=1;/行計(jì)數(shù)器,保存行號(hào)int guanjz(char ch1);/關(guān)鍵字和標(biāo)識(shí)符判斷char ch,infile15,outfile15;/定義輸入和輸出文件名printf(*Enter the infile name*n);scanf(%s,infile);/輸入需要掃描的文件名printf(*Enter the outfile name*n);scanf(%
6、s,outfile);/輸入需要另存為的文件名if(fp = fopen(infile,r) = NULL)/打開(kāi)需要掃描的文件printf(cannot open filen);exit(0);if(fp1 = fopen(outfile,w) = NULL)/打開(kāi)需要存入的文件printf(cannot open filen);exit(0);printf(n*n);printf(* 開(kāi)始進(jìn)行詞法分析 *n);printf(*n);printf(n*n);printf(行號(hào)字符串種別碼n);printf(*n);fprintf(fp1,*n);fprintf(fp1,行號(hào)字符串種別碼n);
7、fprintf(fp1,*n);while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/*掃描頭文件單詞及保留字*/if(isalpha(ch) | ch=_)/如果第一個(gè)字符為字母或下劃線則判斷為標(biāo)識(shí)符int i=0;char ch130;/假定每個(gè)標(biāo)識(shí)符最長(zhǎng)為ch1i+=ch;/將ch保存到ch10中并使i自加1while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/如果ch為換行符,則行計(jì)數(shù)器自加1if(isalpha(ch) | isdigit(ch) | ch=_)/如果ch為字母、數(shù)字或下劃線就把ch放到ch1
8、i中并使i自加1ch1i+=ch;if(ch=.)/如果ch為小數(shù)點(diǎn)則判斷是否為頭文件 if(ch=fgetc(fp)=h)/如果小數(shù)點(diǎn)后一位為h則判定其為頭文件if(ch=10)hanjsq+;ch1i+=.;ch1i+=h;ch1i=0;/把結(jié)束標(biāo)志放到ch1i中作為單詞結(jié)束標(biāo)志printf(line %d:%s83n,hanjsq,ch1);/以字符串形式輸出ch1fprintf(fp1,line %d:%s83n,hanjsq,ch1);break;else/如果小數(shù)點(diǎn)后一位不是h則判定其為標(biāo)識(shí)符fseek(fp,-1,1);/fp回退1ch1i=0;/把結(jié)束標(biāo)志放到ch1i中作為單詞
9、結(jié)束標(biāo)志printf(line %d:%s%dn,hanjsq,ch1,guanjz(ch1);/以字符串形式輸出ch1fprintf(fp1,line %d:%s%dn,hanjsq,ch1,guanjz(ch1);break;if(!isalpha(ch) & !isdigit(ch) & ch!=_ & ch!=.)/如果ch不為字母、數(shù)字、下劃線和點(diǎn)時(shí)判斷其為標(biāo)識(shí)符ch1i=0;printf(line %d:%s%dn,hanjsq,ch1,guanjz(ch1);fprintf(fp1,line %d:%s%dn,hanjsq,ch1,guanjz(ch1);break;/*掃描數(shù)字
10、*/if(isdigit(ch) | ch=-)/如果ch為數(shù)字或-if(isdigit(ch)/如果ch為數(shù)字printf(line %d:%c,hanjsq,ch);fprintf(fp1,line %d:%c,hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/預(yù)讀一位如果ch為數(shù)字和點(diǎn)則循環(huán)輸出if(isdigit(ch) | ch=.)printf(%c,ch);fprintf(fp1,%c,ch);else/否則視為數(shù)字結(jié)束printf(46n);fprintf(fp1,46n);fseek(fp,-1,1);/回退一位ch=0;/置ch為0,以免影響下
11、面誤判并順利退出掃描數(shù)字break;if(ch=-)/如果ch為-ch=fgetc(fp);/預(yù)讀一位if(ch=-)/如果ch還是為-則判斷為自減符-printf(line %d:-80n,hanjsq);fprintf(fp1,line %d:-80n,hanjsq);if(ch=)/如果ch為,則判斷為結(jié)構(gòu)體運(yùn)算符-printf(line %d:-81n,hanjsq);fprintf(fp1,line %d:-81n,hanjsq);if(isdigit(ch)/如果ch為數(shù)字則可能為減號(hào)或負(fù)號(hào)fseek(fp,-3,1);/回退3為判斷ch=fgetc(fp);if(isdigit(
12、ch)/如果ch為數(shù)字則判斷-為減號(hào) ch=fgetc(fp);printf(line %d:%c79n,hanjsq,ch);fprintf(fp1,line %d:%c79n,hanjsq,ch);else /否則判斷-為負(fù)號(hào)ch=fgetc(fp);printf(line %d:%c,hanjsq,ch);fprintf(fp1,line %d:%c,hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/預(yù)讀一位如果ch為數(shù)字和點(diǎn)則循環(huán)輸出if(isdigit(ch) | ch=.)printf(%c,ch);fprintf(fp1,%c,ch);else/否則
13、視為數(shù)字結(jié)束printf(46n);fprintf(fp1,46n);fseek(fp,-1,1);/回退1break;/*掃描注釋*/if(ch=/)/如果ch為/則可能為注釋ch=fgetc(fp);/讀下一個(gè)字符if(ch=10)hanjsq+;if(ch=/)/如果該字符也為/則判斷為注釋一行while(fgetc(fp)!=10);if(ch=10)hanjsq+;/直到遇到換行符出現(xiàn)才認(rèn)為注釋結(jié)束if(ch=*)/如果該字符為*則判斷為注釋多行/直到出現(xiàn)*/才認(rèn)為注釋結(jié)束while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;if(ch=*)/出現(xiàn)
14、*/且接著出現(xiàn)/if(ch=fgetc(fp)=/)break;else/否則原樣輸出/printf(line %d:/83n,hanjsq);fprintf(fp1,line %d:/83n,hanjsq);fseek(fp,-1,1);/回退1break;/*掃描引號(hào)*/if(ch=)/出現(xiàn)引號(hào)int i=0;printf(line %d:%c82n,hanjsq,ch);fprintf(fp1,line %d:%c82n,hanjsq,ch);printf(line %d:,hanjsq);fprintf(fp1,line %d:,hanjsq);while(!feof(fp)/先整體輸
15、出引號(hào)內(nèi)所有字符并定為第99類(lèi)ch=fgetc(fp);i+;/用于積累回退長(zhǎng)度if(ch=10)hanjsq+;if(ch!=)if(ch!=32)printf(%c,ch);fprintf(fp1,%c,ch);else break;printf(99n);fprintf(fp1,99n);fseek(fp,-i,1);/回退到引號(hào)開(kāi)始for(;i0;i-)ch=fgetc(fp);if(ch=92)/如果ch為則可能為轉(zhuǎn)義字符char ch513=abfntv?0;/轉(zhuǎn)義字符集ch=fgetc(fp);/預(yù)讀一位for(int k=0;k12;k+)/如果為轉(zhuǎn)義字符則輸出if(ch=ch
16、5k)printf(line %d:%c%dn,hanjsq,ch,k+33);fprintf(fp1,line %d:%c%dn,hanjsq,ch,k+33);if(ch=d & isdigit(fgetc(fp) & isdigit(fgetc(fp)/任意字符轉(zhuǎn)換為三位八進(jìn)制 fseek(fp,-2,1);printf(line %d:%c%c44n,hanjsq,fgetc(fp),fgetc(fp);fprintf(fp1,line %d:%c%c44n,hanjsq,fgetc(fp),fgetc(fp);if(ch=x & isdigit(fgetc(fp) & isdigit
17、(fgetc(fp)/任意字符轉(zhuǎn)換為二位十六進(jìn)制 fseek(fp,-2,1);printf(line %d:%c%c45n,hanjsq,fgetc(fp),fgetc(fp);fprintf(fp1,line %d:%c%c45n,hanjsq,fgetc(fp),fgetc(fp);if(ch=%)/如果為%則可能為%s%c%dch=fgetc(fp);char bfh4=dcs;for(i=0;i3;i+)if(bfhi=ch)printf(line %d:%c83n,hanjsq,ch);fprintf(fp1,line %d:%c83n,hanjsq,ch);/*掃描其他符號(hào)*/i
18、f(!isdigit(ch) & !isalpha(ch) & ch!=_ & ch!= & ch!=/)char ch214=#()*:%;/定義部分單符號(hào)集char ch39=+?=|&!;/定義部分單符號(hào)或雙符號(hào)(前半部分)集char ch49=+=|&=;/定義部分雙符號(hào)(后半部分)for(int i=0;i13;i+)/判斷單個(gè)符號(hào)if(ch=ch2i)printf(line %d:%c%dn,hanjsq,ch,i+48);fprintf(fp1,line %d:%c%dn,hanjsq,ch,i+48);for(int j=0;j8;j+)/判斷雙符號(hào)if(ch=ch3j)/如果
19、ch與ch3中第j個(gè)字符匹配ch=fgetc(fp);/預(yù)讀一位/if(ch=10)hanjsq+;if(ch=ch4j)/且ch與ch4第j個(gè)匹配,則表示ch3j與ch4j連起來(lái)為一個(gè)雙符號(hào)printf(line %d:%c%c%dn,hanjsq,ch3j,ch4j,i+69);fprintf(fp1,line %d:%c%c%dn,hanjsq,ch3j,ch4j,i+69);if(ch= & ch3j=)/判斷符printf(line %d:77n,hanjsq);fprintf(fp1,line %d: & ch3j=)/判斷符printf(line %d:78n,hanjsq);fprintf(fp1,line %d:78n,hanjsq);else/否則表示ch3j為單符號(hào),不是雙符號(hào)的一部分printf(line %d
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年Adobe考試備考心態(tài)試題及答案
- 機(jī)械工程師資格考試的綜合素質(zhì)提升試題及答案
- 校園安全形勢(shì)分析與工作部署專(zhuān)題會(huì)議
- 丙烯腈合成工藝畢業(yè)設(shè)計(jì)答辯
- 2024年Adobe考試的學(xué)習(xí)反饋技巧試題及答案
- 電氣工程師資格證書(shū)考試技能拓展試題及答案
- 2024年機(jī)械工程師資格證書(shū)考試應(yīng)力分布試題及答案
- 2024焊接工程師資格考試應(yīng)對(duì)技巧試題及答案
- 2024年CAD工程師認(rèn)證考試標(biāo)準(zhǔn)試題及答案
- 全生命周期健康數(shù)據(jù)平臺(tái)的研發(fā)進(jìn)展與應(yīng)用前景
- (完整版)外科護(hù)理學(xué)知識(shí)點(diǎn)整理
- 2019版《壓力性損傷的預(yù)防和治療:臨床實(shí)踐指南》解讀
- 在那遙遠(yuǎn)的地方課件
- 圍堰吹填施工方案
- 創(chuàng)業(yè)計(jì)劃書(shū)案例-產(chǎn)品類(lèi)-南大無(wú)醇酒創(chuàng)業(yè)完全版
- 食品生產(chǎn)企業(yè)動(dòng)態(tài)風(fēng)險(xiǎn)因素量化分值表食品生產(chǎn)日常監(jiān)督檢查要點(diǎn)表
- 基層醫(yī)療衛(wèi)生機(jī)構(gòu)依法執(zhí)業(yè)自查表
- 氣管插管術(shù)培訓(xùn)課件
- 普通高等學(xué)校畢業(yè)生就業(yè)協(xié)議書(shū)(三方協(xié)議)
- 電腦故障診斷卡說(shuō)明書(shū)
- 2022年7月2日江蘇省事業(yè)單位招聘考試《綜合知識(shí)和能力素質(zhì)》(管理崗客觀題)及答案
評(píng)論
0/150
提交評(píng)論