版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、計(jì)算機(jī)科學(xué)與工程系編譯原理課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告姓名:_ *_ 學(xué)號_ *_ 年級專業(yè)及班級_08計(jì)算機(jī)科學(xué)與技術(shù) 成績 實(shí)驗(yàn)名稱詞法分析程序設(shè)計(jì)與實(shí)現(xiàn)完成日期2011/4/12指導(dǎo)教師*實(shí)驗(yàn)?zāi)康模耗軌虿捎肅編程語言實(shí)現(xiàn)簡單的詞法分析程序;設(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對詞法分析原理的理解實(shí)驗(yàn)要求: 1. 對單詞的構(gòu)詞規(guī)則有明確的定義;2. 編寫的分析程序能夠正確識別源程序中的單詞符號; 3. 識別出的單詞以的形式保存在符號表中(鏈表);4. 詞法分析中源程序的輸入以.c格式,分析后的符號表,將二元組保存在.txt文件中。實(shí)驗(yàn)內(nèi)容:選擇高級語言(C語言),編制它的詞法分析程序。詞法分析程序的
2、實(shí)現(xiàn)可以采用任何一種編程工具實(shí)驗(yàn)原理:1、算法的基本任務(wù)是從字符串表示的源程序中識別出具有獨(dú)立意義的單詞符號;2、其基本思想是根據(jù)掃描到單詞符號的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號。 實(shí)驗(yàn)分析:(1)關(guān)鍵字:if else while do case int break等所有的關(guān)鍵字都是小寫。(2)運(yùn)算符和界符: = + - * / = = = ; ( ) 等(3)其他單詞是標(biāo)識符(ID)和整型常數(shù)(SUM),通過以下正規(guī)式定義:ID = _ | letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和換行符組成。空格一般用來分隔ID、S
3、UM、運(yùn)算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。 (5)注釋被忽略(6)各種單詞符號對應(yīng)的種別碼(如下):單詞符號種別碼單詞符號種別碼auto1double2int3struct4break5else6long7switch8case9enum10register11typedef12char13extern14return15union16const17float18short19unsigned20continue21for22signed23void24default25goto26sizeof27volatile28do29while30static31if32a33b34f35n
4、36t37v3839?4041”42043ddd44 xhh45數(shù)字46標(biāo)識符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其他類別99實(shí)驗(yàn)流程圖(由于流程圖過大因此各部分分開寫):整體:掃描注釋:掃描數(shù)字:掃描引號:掃描單詞:掃描其他字符:實(shí)驗(yàn)環(huán)境:需要TC、VC+ 6.0等開發(fā)工具作為本次試驗(yàn)的環(huán)境。實(shí)驗(yàn)步驟:1、準(zhǔn)備: 用TC、VC+等開發(fā)工具;2、對本實(shí)驗(yàn)的任務(wù)進(jìn)行分析,確定實(shí)現(xiàn)功能的函數(shù);3、寫好程序,仔細(xì)修改函數(shù);4
5、、上機(jī)操作:輸入源程序,修改、調(diào)試,運(yùn)行。5、寫好試驗(yàn)報(bào)告。實(shí)驗(yàn)調(diào)試過程及測試結(jié)果/*源代碼*/#include#include#include #includevoid main()FILE *fp,*fp1;int hanjsq=1;/行計(jì)數(shù)器,保存行號int guanjz(char ch1);/關(guān)鍵字和標(biāo)識符判斷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)/打開需要掃描的文件printf(cannot open filen);exit(0);if(fp1 = fopen(outfile,w) = NULL)/打開需要存入的文件printf(cannot open filen);exit(0);printf(n*n);printf(* 開始進(jìn)行詞法分析 *n);printf(*n);printf(n*n);printf(行號字符串種別碼n);printf(*n);fprintf(fp1,*n);fprintf(fp1,行號字符串種別碼n);
7、fprintf(fp1,*n);while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/*掃描頭文件單詞及保留字*/if(isalpha(ch) | ch=_)/如果第一個(gè)字符為字母或下劃線則判斷為標(biāo)識符int i=0;char ch130;/假定每個(gè)標(biāo)識符最長為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)識符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)識符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ù)字則可能為減號或負(fù)號fseek(fp,-3,1);/回退3為判斷ch=fgetc(fp);if(isdigit(
12、ch)/如果ch為數(shù)字則判斷-為減號 ch=fgetc(fp);printf(line %d:%c79n,hanjsq,ch);fprintf(fp1,line %d:%c79n,hanjsq,ch);else /否則判斷-為負(fù)號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;/*掃描引號*/if(ch=)/出現(xiàn)引號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、出引號內(nèi)所有字符并定為第99類ch=fgetc(fp);i+;/用于積累回退長度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);/回退到引號開始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);/*掃描其他符號*/i
18、f(!isdigit(ch) & !isalpha(ch) & ch!=_ & ch!= & ch!=/)char ch214=#()*:%;/定義部分單符號集char ch39=+?=|&!;/定義部分單符號或雙符號(前半部分)集char ch49=+=|&=;/定義部分雙符號(后半部分)for(int i=0;i13;i+)/判斷單個(gè)符號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+)/判斷雙符號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連起來為一個(gè)雙符號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為單符號,不是雙符號的一部分printf(line %d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度獵聘人才委托合同(能源資源開發(fā))
- 2025年度消防安全風(fēng)險(xiǎn)評估與整改服務(wù)合作協(xié)議
- 2025年度度假別墅購房定金協(xié)議
- 2025年度影視作品改編版權(quán)購買合同
- 2025年度足療養(yǎng)生中心全面資產(chǎn)轉(zhuǎn)讓合同
- 2025年度科技創(chuàng)新項(xiàng)目資金托管協(xié)議書
- 二零二五年度煤炭運(yùn)輸合同風(fēng)險(xiǎn)管理及保險(xiǎn)理賠服務(wù)協(xié)議
- 2025年度智能穿戴設(shè)備合伙人合作協(xié)議范本4篇
- 2025年度軌道交通車輛維修與改造合同范本3篇
- 2025年度智能物流配送服務(wù)合同規(guī)范范本4篇
- 海外資管機(jī)構(gòu)赴上海投資指南(2024版)
- 山東省青島市2023-2024學(xué)年七年級上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 墓地銷售計(jì)劃及方案設(shè)計(jì)書
- 從偏差行為到卓越一生3.0版
- 優(yōu)佳學(xué)案七年級上冊歷史
- 鋁箔行業(yè)海外分析
- 紀(jì)委辦案安全培訓(xùn)課件
- 超市連鎖行業(yè)招商策劃
- 城市道路智慧路燈項(xiàng)目 投標(biāo)方案(技術(shù)標(biāo))
- 【公司利潤質(zhì)量研究國內(nèi)外文獻(xiàn)綜述3400字】
- 工行全國地區(qū)碼
評論
0/150
提交評論