版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《編譯原理》課程實驗指導書序言編譯原理實驗環(huán)節(jié),主要通過對編譯器的兩個重要模塊-詞法和語法模塊編程調試實現(xiàn),使學生能應用編譯原理的基本理論和方法,學會用C/C++高級程序設計語言設計詞法分析器和語法分析器,加深對編譯原理理論的分析理解,鞏固所學知識,培養(yǎng)和提高學生的動手實踐能力。實驗一設計實現(xiàn)簡單語言的詞法分析器1、實驗目的通過該實驗,熟練應用編譯原理關于詞法分析的基本理論和方法;學會用C/C++高級程序設計語言設計一個詞法分析器;加深對編譯原理理論的分析理解,提高實際操作和解決具體問題的能力。2、實驗條件計算機上安裝C/C++編譯處理軟件。3、實驗內容及要求對下述單詞表定義的語言設計編制一個詞法分析器。單詞符號及種別表和詞法分析器功能及基本要求如下:(1)單詞符號及種別表單詞符號種別編碼單詞值main1int2float3double4char5if6else7do8while9l(l|d)*10內部字符串(+|-|ε)dd*(.dd*|ε)(e(+|-|ε)dd*|ε)20二進制數(shù)值表示=21+22-23*24/25(26)27{28}29,30;31>32>=33<34<=35==36!=37#0(2)詞法分析器功能及基本要求處理用戶提交的符合上述詞法的源代碼序列,進行詞法分析,并輸出單詞二元組。4、主要參考步驟(1)畫出識別上述語言單詞的狀態(tài)轉換圖(2)用C/C++語言編寫詞法分析程序(應考慮能被語法分析程序調用)(3)預處理,去除注釋、多余空格、Tab字符、回車換行符等(4)設計若干用例,上機測試并通過所設計實現(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);(本例應有出錯信息)5、思考數(shù)字的正負號與運算符加減如何處理,識別數(shù)字的DFA怎樣和運算符加減等融合在一起,進而指導詞法分析器的程序編寫。6、實驗報告提交格式(1)總體設計思想先定義一個結構體用于存放單詞的種別編碼和單詞符號,定義一個輸入緩沖區(qū)字符數(shù)組,一個單詞緩沖區(qū)字符數(shù)組,定義scaner()函數(shù),通過結構體定義一個myword對象,運用m_getch()函數(shù)讀取輸入的一個字符,并判斷是否為數(shù)字,字母,或符號,通過concat()函數(shù)將數(shù)字或字母的整體進行連接,每識別一個單詞就返回給WORD結構體,并在主函數(shù)中輸出單詞的種別編碼和符號,直到所有的單詞全部識別完。(2)詳細算法設計1.通過m_getch()函數(shù)讀入一個字符,然后判斷是否為字母,如果是字母,就繼續(xù)讀入,判斷下一個字符是否為字母或數(shù)字,如果是,就用concat()連接到一起,并返回種別編碼10和連接后的單詞;如果字母單詞與關鍵字字表中的相同,就返回關鍵字和對應的編碼。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ù)連接,并存入結構體,返回編碼20和數(shù)字單詞,如果‘.’后面不是數(shù)字則輸出錯誤;如果在讀入一段數(shù)字后字符是‘e’,連接后將后面的‘+’,‘-’,和數(shù)字繼續(xù)連接,并存入結構體,返回編碼20和數(shù)字單詞。elseif(digit()){concat();m_getch();while(digit()){concat();m_getch();}if(ch=='.'){concat();m_getch();if(letter()||ch==''){printf("出錯\n");myword->typenum=0;myword->word="錯誤";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.通過對輸入不同的符號進行判斷,并返回對應的種別編碼和符號單詞,如果輸入的是“/*------*/”則判定為注解,如果輸入的是“/*”或“/*----*”則判定為輸入錯誤并返回-1;如果輸入的是‘!’而不是“!=”也判定為錯誤。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("輸入錯誤:\n");myword->typenum=-1;myword->word="錯誤";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ù)相關說明主函數(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ū)讀一個字符函數(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;}檢索是否為關鍵字:intreserve(){inti=0;while(strcmp(rwtab[i],_END)){if(!strcmp(rwtab[i],token)){returni+1;}i=i+1;}return10;}回退一個字符函數(shù):voidretract(){p_input=p_input-1;}(5)輸入與輸出(包括出錯處理)輸入:所給文法的源程序字符串。輸出:二元組構成的序列。(syn,token或sum)其中:syn為單詞種別碼;token為存放的單詞自身字符串;sum為整型常數(shù)。出錯處理:(6)程序運行結果(屏幕截圖)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);(本例應有出錯信息)(7)詞法分析器使用說明運行程序,提示“EnterYourwords(endwith#):”,輸入要分析的語句或詞語,輸入完后再末尾加上“#”,回車,在屏幕上顯示剛輸入的詞語或語句,然后程序對詞語逐個分析,返回并顯示每個詞語的單詞符號和種別編碼,分析完畢后,輸入“#”結束程序。(8)心得與體會本次的編譯原理上機實驗,讓我對語言有了新的認識,運用語言來編寫程序,也能運用語言來對每個文法中的單詞進行分析,并輸出每個單詞的種別編碼,通過詞法分析器的設計,對每個單詞的字符讀入,連接和存取有了新的方法來實現(xiàn),通過對全局變量指針的修改來實現(xiàn)對不同位置的字符進行操作,也發(fā)現(xiàn)了自己C語言知識掌握的不全,在用多個if和elseif語句進行判別時,括號的錯誤編寫導致判斷的錯誤,花了大量的時間來檢查和修改,在多個地方需要進行相同判別時,是直接復制,導致代碼的多和繁瑣,也讓程序運行效率變低。雖然不容易完成,但還是慢慢學會了解決,通過自己完成問題。(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中 食品 課程設計
- 2024年學年學校安全工作計劃
- 揚塵專項施工方案
- 路肩拆除施工方案
- 2024石榴產(chǎn)業(yè)鏈上下游企業(yè)戰(zhàn)略合作合同3篇
- 課程設計折疊桌椅
- 2025年度文化創(chuàng)意產(chǎn)業(yè)項目投資合同4篇
- 年度梅酒競爭策略分析報告
- 洗輪機施工方案
- 2025年度鐵路機車車輛維修與維護服務協(xié)議4篇
- (二統(tǒng))大理州2025屆高中畢業(yè)生第二次復習統(tǒng)一檢測 物理試卷(含答案)
- 口腔執(zhí)業(yè)醫(yī)師定期考核試題(資料)帶答案
- 2024人教版高中英語語境記單詞【語境記單詞】新人教版 選擇性必修第2冊
- 能源管理總結報告
- 充電樁巡查記錄表
- 阻燃材料的阻燃機理建模
- CJT 511-2017 鑄鐵檢查井蓋
- 配電工作組配電網(wǎng)集中型饋線自動化技術規(guī)范編制說明
- 2024高考物理全國乙卷押題含解析
- 介入科圍手術期護理
- 青光眼術后護理課件
評論
0/150
提交評論