![《編譯原理》課程實(shí)驗(yàn)指導(dǎo)書_第1頁](http://file4.renrendoc.com/view11/M03/2C/24/wKhkGWWgsqCAHIBjAAHFCZc2gyg751.jpg)
![《編譯原理》課程實(shí)驗(yàn)指導(dǎo)書_第2頁](http://file4.renrendoc.com/view11/M03/2C/24/wKhkGWWgsqCAHIBjAAHFCZc2gyg7512.jpg)
![《編譯原理》課程實(shí)驗(yàn)指導(dǎo)書_第3頁](http://file4.renrendoc.com/view11/M03/2C/24/wKhkGWWgsqCAHIBjAAHFCZc2gyg7513.jpg)
![《編譯原理》課程實(shí)驗(yàn)指導(dǎo)書_第4頁](http://file4.renrendoc.com/view11/M03/2C/24/wKhkGWWgsqCAHIBjAAHFCZc2gyg7514.jpg)
![《編譯原理》課程實(shí)驗(yàn)指導(dǎo)書_第5頁](http://file4.renrendoc.com/view11/M03/2C/24/wKhkGWWgsqCAHIBjAAHFCZc2gyg7515.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《編譯原理》課程實(shí)驗(yàn)指導(dǎo)書序言編譯原理實(shí)驗(yàn)環(huán)節(jié),主要通過對編譯器的兩個(gè)重要模塊-詞法和語法模塊編程調(diào)試實(shí)現(xiàn),使學(xué)生能應(yīng)用編譯原理的基本理論和方法,學(xué)會用C/C++高級程序設(shè)計(jì)語言設(shè)計(jì)詞法分析器和語法分析器,加深對編譯原理理論的分析理解,鞏固所學(xué)知識,培養(yǎng)和提高學(xué)生的動手實(shí)踐能力。實(shí)驗(yàn)一設(shè)計(jì)實(shí)現(xiàn)簡單語言的詞法分析器1、實(shí)驗(yàn)?zāi)康耐ㄟ^該實(shí)驗(yàn),熟練應(yīng)用編譯原理關(guān)于詞法分析的基本理論和方法;學(xué)會用C/C++高級程序設(shè)計(jì)語言設(shè)計(jì)一個(gè)詞法分析器;加深對編譯原理理論的分析理解,提高實(shí)際操作和解決具體問題的能力。2、實(shí)驗(yàn)條件計(jì)算機(jī)上安裝C/C++編譯處理軟件。3、實(shí)驗(yàn)內(nèi)容及要求對下述單詞表定義的語言設(shè)計(jì)編制一個(gè)詞法分析器。單詞符號及種別表和詞法分析器功能及基本要求如下:(1)單詞符號及種別表單詞符號種別編碼單詞值main1int2float3double4char5if6else7do8while9l(l|d)*10內(nèi)部字符串(+|-|ε)dd*(.dd*|ε)(e(+|-|ε)dd*|ε)20二進(jìn)制數(shù)值表示=21+22-23*24/25(26)27{28}29,30;31>32>=33<34<=35==36!=37#0(2)詞法分析器功能及基本要求處理用戶提交的符合上述詞法的源代碼序列,進(jìn)行詞法分析,并輸出單詞二元組。4、主要參考步驟(1)畫出識別上述語言單詞的狀態(tài)轉(zhuǎn)換圖(2)用C/C++語言編寫詞法分析程序(應(yīng)考慮能被語法分析程序調(diào)用)(3)預(yù)處理,去除注釋、多余空格、Tab字符、回車換行符等(4)設(shè)計(jì)若干用例,上機(jī)測試并通過所設(shè)計(jì)實(shí)現(xiàn)的詞法分析器1.+++-123.456e-127*+45.99e+200++abc+-cnt++492.(+123.456+-456.789e-120)*m2+(a++456)*-c1233.++4+1.44.a+-149+49.7e+127+m1235.x=a++1.27e+186.--20+-124.987e+127+-xyzbeginif(x>=-1.27e-18)xyz=(x1+y1)*-124.987e+1277.--20+-124.e+111-137++569.246e+(123+ivar);x=1;if(x>1)y=1234;x=(123+abc);(本例應(yīng)有出錯(cuò)信息)5、思考數(shù)字的正負(fù)號與運(yùn)算符加減如何處理,識別數(shù)字的DFA怎樣和運(yùn)算符加減等融合在一起,進(jìn)而指導(dǎo)詞法分析器的程序編寫。6、實(shí)驗(yàn)報(bào)告提交格式(1)總體設(shè)計(jì)思想先定義一個(gè)結(jié)構(gòu)體用于存放單詞的種別編碼和單詞符號,定義一個(gè)輸入緩沖區(qū)字符數(shù)組,一個(gè)單詞緩沖區(qū)字符數(shù)組,定義scaner()函數(shù),通過結(jié)構(gòu)體定義一個(gè)myword對象,運(yùn)用m_getch()函數(shù)讀取輸入的一個(gè)字符,并判斷是否為數(shù)字,字母,或符號,通過concat()函數(shù)將數(shù)字或字母的整體進(jìn)行連接,每識別一個(gè)單詞就返回給WORD結(jié)構(gòu)體,并在主函數(shù)中輸出單詞的種別編碼和符號,直到所有的單詞全部識別完。(2)詳細(xì)算法設(shè)計(jì)1.通過m_getch()函數(shù)讀入一個(gè)字符,然后判斷是否為字母,如果是字母,就繼續(xù)讀入,判斷下一個(gè)字符是否為字母或數(shù)字,如果是,就用concat()連接到一起,并返回種別編碼10和連接后的單詞;如果字母單詞與關(guān)鍵字字表中的相同,就返回關(guān)鍵字和對應(yīng)的編碼。WORD*scaner(){WORD*myword=newWORD;myword->typenum=10;myword->word="";p_token=0;m_getch();getbc();if(letter()){while(letter()||digit()){concat();m_getch();}retract();myword->typenum=reserve();myword->word=token;return(myword);}2.判斷讀入的字符是否為數(shù)字,如果是就連接并存入token數(shù)組,繼續(xù)判斷讀入的字符是否是‘.’或‘e’,如果是‘.’繼續(xù)連接,并判斷后面是否為數(shù)字,如果是,繼續(xù)連接,并判斷是否讀入了字符‘e’,如果是,繼續(xù)連接,并將后面的‘+’,‘-’,和數(shù)字繼續(xù)連接,并存入結(jié)構(gòu)體,返回編碼20和數(shù)字單詞,如果‘.’后面不是數(shù)字則輸出錯(cuò)誤;如果在讀入一段數(shù)字后字符是‘e’,連接后將后面的‘+’,‘-’,和數(shù)字繼續(xù)連接,并存入結(jié)構(gòu)體,返回編碼20和數(shù)字單詞。elseif(digit()){concat();m_getch();while(digit()){concat();m_getch();}if(ch=='.'){concat();m_getch();if(letter()||ch==''){printf("出錯(cuò)\n");myword->typenum=0;myword->word="錯(cuò)誤";return(myword);}elseif(digit()){concat();m_getch();while(digit()){concat();m_getch();}if(ch==NULL){retract();myword->typenum=20;myword->word=token;return(myword);}elseif(ch=='e'){concat();m_getch();if(ch=='+'||ch=='-'){concat();m_getch();if(digit()){concat();m_getch();while(digit()){concat();m_getch();}retract();myword->typenum=20;myword->word=token;return(myword);}}elseif(digit()){concat();m_getch();while(digit()){concat();m_getch();}retract();myword->typenum=20;myword->word=token;return(myword);}}}}elseif(ch=='e'){concat();m_getch();if(ch=='+'||ch=='-'){concat();m_getch();if(digit()){concat();m_getch();while(digit()){concat();m_getch();}retract();myword->typenum=20;myword->word=token;return(myword);}}elseif(digit()){concat();m_getch();while(digit()){concat();m_getch();}retract();myword->typenum=20;myword->word=token;return(myword);}}retract();myword->typenum=20;myword->word=token;return(myword);}3.通過對輸入不同的符號進(jìn)行判斷,并返回對應(yīng)的種別編碼和符號單詞,如果輸入的是“/*------*/”則判定為注解,如果輸入的是“/*”或“/*----*”則判定為輸入錯(cuò)誤并返回-1;如果輸入的是‘!’而不是“!=”也判定為錯(cuò)誤。retract();myword->typenum=23;myword->word="-";return(myword);break;case'*':myword->typenum=24;myword->word="*";return(myword);break;case'/':m_getch();if(ch=='*'){m_getch();for(;;){m_getch();if(ch=='*'){m_getch();if(ch=='/'){myword->typenum=0;myword->word="注解";return(myword);break;}elseprintf("輸入錯(cuò)誤:\n");myword->typenum=-1;myword->word="錯(cuò)誤";return(myword);break;}}}myword->typenum=25;myword->word="/";return(myword);break;case'(':myword->typenum=26;myword->word="(";return(myword);break;case')':myword->typenum=27;myword->word=")";return(myword);break;case'{':myword->typenum=28;myword->word="{";return(myword);break;case'}':myword->typenum=29;myword->word="}";return(myword);break;case',':myword->typenum=30;myword->word=",";return(myword);break;case';':myword->typenum=31;myword->word=";";return(myword);break;case'>':m_getch();if(ch=='='){myword->typenum=33;myword->word=">=";return(myword);}retract();myword->typenum=32;myword->word=">";return(myword);break;case'<':m_getch();if(ch=='='){myword->typenum=35;myword->word="<=";return(myword);}retract();myword->typenum=34;myword->word="<";return(myword);break;case'!':m_getch();if(ch=='='){myword->typenum=37;myword->word="!=";return(myword);}retract();myword->typenum=-1;myword->word="ERROR";return(myword);break;case'\0':myword->typenum=1000;myword->word="OVER";return(myword);break;default:myword->typenum=-1;myword->word="ERROR";return(myword);}}(3)流程框圖和狀態(tài)圖(4)函數(shù)相關(guān)說明主函數(shù):voidmain(){intover=1;WORD*oneword=newWORD;printf("EnterYourwords(endwith#):");scanf("%[^#]s",input);p_input=0;printf("Yourwords:\n%s\n",input);while(over<1000&&over!=-1){oneword=scaner();if(oneword->typenum<1000)printf("(%d,%s)\n",oneword->typenum,oneword->word);over=oneword->typenum;}printf("\npress#toexit:");scanf("%[^#]s",input);}從緩沖區(qū)讀一個(gè)字符函數(shù);charm_getch(){ch=input[p_input];p_input=p_input+1;return(ch);}去掉空白符號函數(shù):voidgetbc(){while(ch==''||ch==10){ch=input[p_input];p_input=p_input+1;}}拼接單詞函數(shù):voidconcat(){token[p_token]=ch;p_token=p_token+1;token[p_token]='\0';}判斷是否為字母函數(shù):intletter(){if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')return1;elsereturn0;}判斷是否為數(shù)字函數(shù):intdigit(){if(ch>='0'&&ch<='9')return1;elsereturn0;}檢索是否為關(guān)鍵字:intreserve(){inti=0;while(strcmp(rwtab[i],_END)){if(!strcmp(rwtab[i],token)){returni+1;}i=i+1;}return10;}回退一個(gè)字符函數(shù):voidretract(){p_input=p_input-1;}(5)輸入與輸出(包括出錯(cuò)處理)輸入:所給文法的源程序字符串。輸出:二元組構(gòu)成的序列。(syn,token或sum)其中:syn為單詞種別碼;token為存放的單詞自身字符串;sum為整型常數(shù)。出錯(cuò)處理:(6)程序運(yùn)行結(jié)果(屏幕截圖)1.+++-123.456e-127*+45.99e+200++abc+-cnt++492.(+123.456+-456.789e-120)*m2+(a++456)*-c1233.++4+1.44.a+-149+49.7e+127+m1235.x=a++1.27e+186.--20+-124.987e+127+-xyzbeginif(x>=-1.27e-18)xyz=(x1+y1)*-124.987e+1277.--20+-124.e+111-137++569.246e+(123+ivar);x=1;if(x>1)y=1234;x=(123+abc);(本例應(yīng)有出錯(cuò)信息)(7)詞法分析器使用說明運(yùn)行程序,提示“EnterYourwords(endwith#):”,輸入要分析的語句或詞語,輸入完后再末尾加上“#”,回車,在屏幕上顯示剛輸入的詞語或語句,然后程序?qū)υ~語逐個(gè)分析,返回并顯示每個(gè)詞語的單詞符號和種別編碼,分析完畢后,輸入“#”結(jié)束程序。(8)心得與體會本次的編譯原理上機(jī)實(shí)驗(yàn),讓我對語言有了新的認(rèn)識,運(yùn)用語言來編寫程序,也能運(yùn)用語言來對每個(gè)文法中的單詞進(jìn)行分析,并輸出每個(gè)單詞的種別編碼,通過詞法分析器的設(shè)計(jì),對每個(gè)單詞的字符讀入,連接和存取有了新的方法來實(shí)現(xiàn),通過對全局變量指針的修改來實(shí)現(xiàn)對不同位置的字符進(jìn)行操作,也發(fā)現(xiàn)了自己C語言知識掌握的不全,在用多個(gè)if和elseif語句進(jìn)行判別時(shí),括號的錯(cuò)誤編寫導(dǎo)致判斷的錯(cuò)誤,花了大量的時(shí)間來檢查和修改,在多個(gè)地方需要進(jìn)行相同判別時(shí),是直接復(fù)制,導(dǎo)致代碼的多和繁瑣,也讓程序運(yùn)行效率變低。雖然不容易完成,但還是慢慢學(xué)會了解決,通過自己完成問題。(9)源程序清單#include<stdio.h>#include<string.h>#include<stdlib.h>#define_END"ending"typedefstruct{inttypenum;char*word;}WORD;ch
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海技術(shù)服務(wù)合同
- 修理廠轉(zhuǎn)讓協(xié)議書范本
- 家庭住宅裝修簡易合同模板
- 幼兒園房屋租賃合同十
- 委托培訓(xùn)協(xié)議書范本
- 勞務(wù)安全責(zé)任協(xié)議書范本
- 2025年佳木斯貨運(yùn)從業(yè)資格證考試內(nèi)容
- 軟裝合作協(xié)議書范本
- 美容院裝修施工安裝合同
- 腳手架租賃合同
- 《證券投資學(xué)》全套教學(xué)課件
- 2024年全國各地中考語文試題匯編:名著閱讀
- 公司組織架構(gòu)與管理體系制度
- 2024-2030年中國涂碳箔行業(yè)現(xiàn)狀調(diào)查與投資策略分析研究報(bào)告
- 2025高考語文步步高大一輪復(fù)習(xí)講義65練答案精析
- 部編版八年級語文下冊全冊單元教材分析
- 2024-2030年中國派對用品行業(yè)供需規(guī)模調(diào)研及發(fā)展趨勢預(yù)測研究報(bào)告
- 傳染病監(jiān)測預(yù)警與應(yīng)急指揮大數(shù)據(jù)引擎平臺建設(shè)需求
- 2023-2024年度數(shù)字經(jīng)濟(jì)與驅(qū)動發(fā)展公需科目答案(第5套)
- 2024年吉林省中考語文真題
- 工傷保險(xiǎn)代理委托書
評論
0/150
提交評論