編譯原理課程設(shè)計(jì)-算術(shù)表達(dá)式、for、while語句轉(zhuǎn)換為四元式_第1頁
編譯原理課程設(shè)計(jì)-算術(shù)表達(dá)式、for、while語句轉(zhuǎn)換為四元式_第2頁
編譯原理課程設(shè)計(jì)-算術(shù)表達(dá)式、for、while語句轉(zhuǎn)換為四元式_第3頁
編譯原理課程設(shè)計(jì)-算術(shù)表達(dá)式、for、while語句轉(zhuǎn)換為四元式_第4頁
編譯原理課程設(shè)計(jì)-算術(shù)表達(dá)式、for、while語句轉(zhuǎn)換為四元式_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

計(jì)算機(jī)與信息學(xué)院操作系統(tǒng)與編譯原理聯(lián)合課程設(shè)計(jì)報(bào)告》專題:編譯原理部分學(xué)生姓名:學(xué)號(hào):專業(yè)班級(jí):2014年7月一、設(shè)計(jì)目標(biāo)設(shè)計(jì)一個(gè)語法制導(dǎo)翻譯器,將算術(shù)表達(dá)式、for語句、while語句翻譯成四元式。要求先確定一個(gè)定義算術(shù)表達(dá)式、for語句、while語句的文法,為其設(shè)計(jì)一個(gè)語法分析程序,為每條產(chǎn)生式配備一個(gè)語義子程序,按照一遍掃描的語法制導(dǎo)翻譯方法,實(shí)現(xiàn)翻譯程序。對(duì)用戶輸入的任意一個(gè)正確的表達(dá)式,程序?qū)⑵滢D(zhuǎn)換成四元式輸出。二、設(shè)計(jì)思路開發(fā)平臺(tái):VisualC++MFC解決這個(gè)問題的方案分為以下幾個(gè)步驟:1將算數(shù)表達(dá)式、for語句、while語句轉(zhuǎn)換為四元式的第一步為對(duì)讀入的表達(dá)式進(jìn)行處理,即刪除不必要的空格、回車、換行等,保證之后的步驟能夠順利進(jìn)行。2?分析算術(shù)表達(dá)式、for語句、while語句的文法。通過詞法分析判斷語句中的每個(gè)字符的類型,如:數(shù)字、字母、燈尺口勺&符號(hào)等。

建立每種文法的LR(O)分析表,通過每個(gè)文法的LR(O)分析表對(duì)相應(yīng)的表達(dá)式進(jìn)行語法分析。在語法分析正確的情況下,通過語法分析的中間過程的符號(hào)棧輸出四元式,四元式的形式為:(oparglarg2result)。(―)算術(shù)表達(dá)式轉(zhuǎn)換為四元式將算術(shù)表達(dá)式轉(zhuǎn)換為四元式首先考慮了括號(hào)的問題,對(duì)于不同的算術(shù)表達(dá)式第一步進(jìn)行詞法分析,即確定各種符號(hào)的位置。而括號(hào)中的式子是優(yōu)先級(jí)最高的,應(yīng)該最先進(jìn)行處理。我使用了一個(gè)數(shù)組記錄算術(shù)表達(dá)式中括號(hào)的位置,并且定義了first_cc和first_jj函數(shù)對(duì)括號(hào)內(nèi)的乘除法和加減法分別進(jìn)行處理。后將括號(hào)內(nèi)的式子以四元式的形式輸出。通過以上轉(zhuǎn)換,已將原算術(shù)表達(dá)式中的括號(hào)中的內(nèi)容使用大寫字母'A'、'B'……等代替(其中定義聲明了change函數(shù),用來將括號(hào)部分替換為大寫字母)。新的式子中,只含有加減乘除以及賦值這四種運(yùn)算,后根據(jù)優(yōu)先級(jí)的不同,逐步生成四元式。其算法流程圖如右圖所示。(二)for語句轉(zhuǎn)換為四元式語句的文法如下:S->f(E;F;G){H;}S->f(E;X;Y){H;}E->id=cF->id<cG->id++X->id>cY->id-H->id1=id2+id3H->id1=id2+cH->id1=c+id2其中c表示常數(shù)const,表示關(guān)鍵字for,id表示一般標(biāo)識(shí)符。for循環(huán)體內(nèi)部的表達(dá)式一般為算術(shù)表達(dá)式,而算術(shù)表達(dá)式轉(zhuǎn)換為四元式的方法在第一部分已給出,此處H只考慮比較簡(jiǎn)單的情況。

語句的LR(O)分析表如下:AjCTIOV=C&TOff[F■Ff*7F廠r0計(jì)1—1■dg4斗E1—6a創(chuàng)1—§did?|4匚1K?山一盟.SJ-£?盟1潔彳門Id御起1Hti4RdRdR4RdRrtRdTtiKAHF箭REK$HEHfiK予壞25砌審註|価F1Sfi-W5^9昶1—3J£1RfiK6RE-HRRh5]L片耳RT幵t片耳申陽沖1223E3L科0州5p3SS?9托耳]PJKIfijKIEJRl耳]附RIHIK1T耳|KI巒Q利K¥K?Ng銘陋睪塌斗〕S44莘耶莘耶fit耶k!'K9[R9h<Jt9h:<札補(bǔ)|H9R9h:iR9叫1K]口RlIkL(7KIOKNHI”K】K沖KI”耳|0K|03.基本算法流程:本算法定義聲明了兩個(gè)結(jié)構(gòu)體:一個(gè)是Node結(jié)構(gòu)體,其中char型的type中存儲(chǔ)當(dāng)前符號(hào)的類型,CString型的sValue中存儲(chǔ)的為當(dāng)前符號(hào),int型的eValue只有在符號(hào)類型為數(shù)字的情況下才進(jìn)行存儲(chǔ),存儲(chǔ)數(shù)字的大??;另一個(gè)為stack結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體是實(shí)現(xiàn)語法分析中的符號(hào)棧和狀態(tài)棧使用的,并未這兩個(gè)棧分別定義了各自的pop函數(shù)和push函數(shù)。除此之外,本算法中的LR(O)分析表通過二維數(shù)組存儲(chǔ)。其中分為action表和goto表oaction表中的狀態(tài)轉(zhuǎn)換符號(hào),用2-44表示,規(guī)約的符號(hào),用101-110表示。具體的算法流程圖如下:

(三)while語句轉(zhuǎn)換為四元式語句的文法如下:S->while(B){E}E->AEE->AA->iPAA->iB->iTiB->i其中while、(、)、{、}、P、T、;和i均為終結(jié)符,而S、A、B、E這些大寫字母均為非終結(jié)符。T表示比較運(yùn)算符,P表示算術(shù)運(yùn)算符,i表示合法標(biāo)識(shí)符。語句的LR(O)分析表如下:

3.基本算法流程:本算法的基本思想與for語句轉(zhuǎn)換成四元式的思想比較相似,都是對(duì)讀入的語句進(jìn)行詞法分析,后再通過LR(O)分析表對(duì)語句進(jìn)行語法分析,并同時(shí)輸出四元式。與for語句轉(zhuǎn)換成四元式不同的是,while語句轉(zhuǎn)換為四元式在結(jié)構(gòu)體定義等方面做了改進(jìn)。首先是LR(0)分析表的存儲(chǔ)方式進(jìn)行了改進(jìn),本算法中為L(zhǎng)R(0)分析表定義了一個(gè)table的結(jié)構(gòu)體,將action和goto兩個(gè)部分全部存入table的結(jié)構(gòu)體中,是查表的時(shí)候更加方便。除此之外,還定義了obj結(jié)構(gòu)體,此結(jié)構(gòu)體主要是為了存儲(chǔ)所要輸出的四元式,定義了此結(jié)構(gòu)體之后,程序的調(diào)理變得更為清晰了。本算法中符號(hào)棧以及狀態(tài)棧的部分主要調(diào)用了 C++中原有的stack結(jié)構(gòu)體,使用其本身定義的pop函數(shù)以及push函數(shù),簡(jiǎn)化的代碼。以下為算法的流程圖:

四)輸入、輸出以及界面設(shè)計(jì)輸入:本程序的輸入均為語句或表達(dá)式,若每次測(cè)試程序均輸入表達(dá)式,則會(huì)輸入大量式子,浪費(fèi)時(shí)間。所以本程序采用文件讀入的形式,只需要在指定位置輸入文件名即可。輸出:本程序輸出的四元式全部在MFC界面的文本框中顯示??梢詮?fù)制,方便之后的使用。界面設(shè)計(jì):本程序?yàn)榱朔奖闶褂靡约敖缑婷烙^,使用了MFC中的TabControl控件,界面設(shè)計(jì)如下:圖中當(dāng)前標(biāo)簽為“while語句”,顯示的界面為“while語句轉(zhuǎn)換為四元式”。通過若點(diǎn)擊其他標(biāo)簽按鈕,界面也會(huì)切換到相應(yīng)的界面。每個(gè)界面都是一個(gè)對(duì)話框,如下圖所示:EiEi-^CMpIk-rD亡wign3IDD_ABOUT0OM旦IDD_CQh*^.EHWESKilN_DI^IDb_DuLCM^13IDD_DWLOG23IDdZdIIiLOGI田QIcmimiFlAtala^iTjJhln作為主要的文件,去調(diào)用其他的對(duì)話框。首先對(duì)每一個(gè)對(duì)話框(IDD_DIAL0G1-3)進(jìn)行設(shè)置,樣式:下層;邊框:無。如下圖所示:后在文件中添加每個(gè)對(duì)話框的頭文件,以及申明每個(gè)對(duì)話框,代碼如下:#include""#include""#include""CDlg1page1;CDlg2page2;CDlg3page3;在初始化函數(shù)CCompilerDesignDlg::0nInitDialogO中編寫相關(guān)代碼:(0,"算術(shù)表達(dá)式");(1,"for語句");(2,"while語句");(IDD_DIALOG1,&m_tabCtrl);(IDD_DIALOG2,&m_tabCtrl);(IDD_DIALOG3,&m_tabCtrl);CRectrc;(&rc);+=22;-=3;+=2;-=3;ype;if(st[i]=='f')GetDlgItemText(IDC_CF,str_cf);CStringtemp_str3二"關(guān)鍵字:for\r\n";SetDlgItemText(IDC_CF,str_cf+temp_str3);}elseif(st[i]=='i'){CStringtemp_str3=node[i].sValue;str_i=str_i+temp_str3+"";}elseif(st[i]=='c'){CStringtemp_str3=node[i].sValue;str_c=str_c+temp_str3+"";number[count++]=node[i].sValue;GetDlgItemText(IDC_CF,str_cf);SetDlgltemText(IDC_CF,str_cf+"符號(hào):"+str_i+"\r\n"+"常數(shù):"+str_c+"\r\n");for(i=0;i<r;i++){ah[i]=node[i].sValue;ct_0[k]=='s'){introw=();(row,"");ct_1[k];tmp_n=strlen(fuhao)-1;fuhao[++tmp_n]=shuru[i++];CStringstr00="";for(l=0;l<len;l++){CStringtemp_str1;("%d",Tai[l]);str00=str00+temp_str1;(row,0,str00);CStringstr11=fuhao;(row,1,str11);CStringstr22="";for(l=i;l<num;l++){CStringtemp_str2=shuru[l];str22=str22+temp_str2;}(row,2,str22);}elseif(action[j].act_0[k]=='r'){introw=();(row,"");X=strlen(W[action[j].act_1[k]])-1;len-=X;for(m=len;m<len+X;m++)fuhao[m]='\0';fuhao[len]=W[action[j].act_1[k]][0];switch(W[action[j].act_1[k]][0]){case'S':l=0;break;case'E':l=1;break;case'B':l=2;break;case'Al=3;break;}len+=1;Tai[len-1]=action[Tai[len-2]].go[l];CStringstr00="";for(l=0;l<len;l++){CStringtemp_str1;("%d",Tai[l]);str00=str00+temp_str1;}(row,0,str00);CStringstr11=fuhao;(row,1,str11);CStringstr22="";for(l=i;l<num;l++){CStringtemp_str2=shuru[l];str22=str22+temp_str2;}(row,2,str22);}elseif(action[j].act_0[k]=='Z'){break;}else{}}函數(shù):主要用于操作符號(hào)棧,并且輸出四元式。

voidCDlg3::produce_obj(charc[],intcount)stack<char>sf;stack<char>s1;stack<char>s;inti,j=0;(';');chart[5]={"ABCD"};for(i=0;i<count+1;i++){if(isalnum(c[i]))(c[i]);elseif(c[i]==';')while()!=';')

());();}}else{loop:if(cmp(c[i],()))(c[i]);else{());();gotoloop;}}while(!isalnum())){());();}while(!()){if()=='+'||()=='-'||()=='*'||()=='/'){equ[j].f=();();equ[j].op2=();();equ[j].op1=();();equ[j].result=t[j];(equ[j].result);j++;}else{equ[j].f=();();();equ[j].result=();();equ[j].op2=equ[j].op1=equ[j-1].result;}}CStringstr00;CStringtemp_str1=rop[0];CStringtemp_str2=a[0];CStringtemp_str3=a[1];str00="(j"+temp_str1+""+temp_str2+""+temp_str3+")\r\n";if(temp_str1==">")str00="(j<="+temp_str2+""+temp_str3+"over)\r\nl:\r\n";elseif(temp_str1=="<")str00="(j>="+temp_str2+""+temp_str3+"over)\r\nl:\r\n";else{}for(i=0;i<=j;i++){CStringtemp_str4=equ[i].f;CStringtemp_str5=equ[i].op1;CStringtemp_str6=equ[i].op2;CStringtemp_str7=equ[i].result;if(i==j)str00=str00+"("+temp_str4+""+temp_str5+""+""+""+temp_str7+")\r\n";elsestr00=str00+"("+temp_str4+""+temp_str5+""+temp_str6+""+temp_str7+")\r\n";}str00=str00+"gotol\r\nover\r\n";SetDlgItemText(IDC_OUT,str00);四、設(shè)計(jì)結(jié)果及數(shù)據(jù)評(píng)測(cè)(一)算術(shù)表達(dá)式轉(zhuǎn)換為四元式測(cè)試測(cè)試一:輸入的表達(dá)式為:test_m3tlil.lxt-記事本文件E~~栢式Q》草咅M|c二廿b*(2/n)*(a-b)運(yùn)行結(jié)果為:測(cè)試二:輸入表達(dá)式為:

"test_nn3thg.txt-記事本文件舊朶輯舊格式Q)查老㈣幫]掃只一〔念-y)/@+葢〕~y)運(yùn)行結(jié)果為:CompilerDesign中同逬旳(四元式]皚產(chǎn)主——寶冃IL砂柿去2D112B0OforlBS^hileiSS界菲莢達(dá)式點(diǎn)CompilerDesign中同逬旳(四元式]皚產(chǎn)主——寶冃IL砂柿去2D112B0OforlBS^hileiSS界菲莢達(dá)式點(diǎn)沏匹元式ffiAIG讀入袁達(dá)云污testma^h^.tKty=A-((x-^y(z+xJ-y)CornpilerDesi.r.住為:(-XyAJ3 ZE)IfABC}(-CyD](-貨f=E□E)/}軌■二旳四元式如Tfor語句轉(zhuǎn)換為四元式測(cè)試1.測(cè)試一:輸入的語句為:tesifarl.tytfor語句轉(zhuǎn)換為四元式測(cè)試1.測(cè)試一:輸入的語句為:tesifarl.tyt-iP.S^: a口文件伺翱⑹梧式Q〕查看的幫助(H)[for(1=0;i<5;i++){jiFnri-1;}£運(yùn)行結(jié)果如下:憚ComplerOesign20112360 屋塚CompikrO&si-中間代碼(四元云)的產(chǎn)生一旦宅LR5撕法憚ComplerOesign20112360 屋塚CompikrO&si-中間代碼(四元云)的產(chǎn)生一旦宅LR5撕法旺去繪||fares- whil馮H也廊菇荃為四五::詞澎淅即不:諫入表這式為f口「[i=觀殆;“幻{m=m+l;}■■崖入的交tKt_FDrl.txt件E旳: _(=01-i)1卜-i5ever)1+i1tl)Fi-tli)i>i1t2)(-繪i)goto1我出ME3云迦卞GOTO*齟 f2三桃 1:3讎 15鉅 -7聞F c11駐 ;6T2.測(cè)試二:輸入語句為:rJtest_for3.txt-記事本回文件舊躺輯舊梧式阿查養(yǎng)㈣幫助何[for(i=5;i>Q;1--){irFmH;}運(yùn)行結(jié)果如下:

測(cè)試三(輸入的語句為錯(cuò)誤的情況):輸入的語句為:|tes1_for2error.t?(t-記事本、二回文件舊盪垢⑥格式◎^WtY)幫肋?for(j=5;j<10){n=nH-5j運(yùn)行結(jié)果如下:

(三)while語句轉(zhuǎn)換為四元式測(cè)試1.測(cè)試一:輸入的語句為:2Jtes-t_whilel.txt-記事本 .二回文件舊脅〔E)格式嶺凹秤助[H)^vhile(k>E)[s= i+5*6;} *運(yùn)行結(jié)果如下:53Compil^rDesign301120*0whil澹句轉(zhuǎn)扭為四j土詞法加[下:◎馬達(dá)式污whilu址活]{=二i+中旬対幷:while交星容:k5::I55去達(dá)Et運(yùn)憫;tr比監(jiān)運(yùn)拆:>?K?;(}{.:■SA服|text_wliilel.til件容為:中旬叱両[E3戀]陀乂蘭一CompilmDe二fori^S|whiledlj==K1,■5over)J.■i(* 56Aj[+iAB)〔二E=]goto1over-r或UE勺四元趙下D2#w025?。?235#<x02357#w<x>02357Bffw(x>502344hv(B02346JMEH2.測(cè)試二:輸入的語句為:運(yùn)行結(jié)果如下:55CompileiOeiignnr2O112S30CompilerDesi-.muvhiI弟句轉(zhuǎn)換肖匹元式呵法分忻如下:速人去達(dá)式為while(x<5J[s=i+l:J關(guān)斟:while:K5sil趙站算論:+比峻運(yùn)算苻:耳界符:門[門|tc5twhilr-2.txt件苕為:I中甸代訶C四壺:1玉產(chǎn)生一僅屯L尺分?jǐn)Q去fcriff-S11whilei&R;0202302350235702357&02M0234S&w[#Xx#w(B)()>■■=K

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論