編譯原理課程設(shè)計(jì)++++do-while+循環(huán)語句的實(shí)現(xiàn)-武漢理工_第1頁
編譯原理課程設(shè)計(jì)++++do-while+循環(huán)語句的實(shí)現(xiàn)-武漢理工_第2頁
編譯原理課程設(shè)計(jì)++++do-while+循環(huán)語句的實(shí)現(xiàn)-武漢理工_第3頁
編譯原理課程設(shè)計(jì)++++do-while+循環(huán)語句的實(shí)現(xiàn)-武漢理工_第4頁
編譯原理課程設(shè)計(jì)++++do-while+循環(huán)語句的實(shí)現(xiàn)-武漢理工_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

武漢理工大學(xué)《編譯原理》課程設(shè)計(jì)書10/11DO-WHILE循環(huán)語句的翻譯程序設(shè)計(jì)-——(LR方法、輸出四元式)1、系統(tǒng)描述通過設(shè)計(jì)、編制、調(diào)試一個DO-WHILE循環(huán)語句的語法及語義分析程序,加深對語法及語義分析原理的理解,并實(shí)現(xiàn)詞法分析程序?qū)卧~序列的詞法檢查和分析。用語法制導(dǎo)完成語義分析,并將形成的中間代碼以四元式的形式輸出。2、文法及屬性文法的描述2.1文法的描述該文法的產(chǎn)生式集合如下所示:Z->do{E}while(T)E->AEE->AA->bopAA->b;T->bop1b其中do、while、(、)、{、}、op、op1、;和b均為終結(jié)符,而Z、A、T、E這些大寫字母均為非終結(jié)符。op1表示比較運(yùn)算符,op表示算術(shù)運(yùn)算符,b表示合法標(biāo)識符。2.2屬性文法的描述對該文法的屬性文法描述如下:Z->do{E}while(T)prinf(ifTgotoEelsegotonext)E->AEprint(E.val=A.val·E.val)E->Aprint(E.val=A.val)A->bopAprint(A=b.ValopA.Val)A->b;A.Val=b;T->bop1bprint(T=b1.Valop1b2.Val)3、語法分析方法描述及語法分析表設(shè)計(jì)3.1語法分析表設(shè)計(jì) LR分析表如下:ACTIONGOTO狀態(tài)do{}while()iopop1;#ZETA0S211A02S33S6454S75R3S6R356S9S107S118R2S29S61210R5R5R511S1312R4R4R41413S151414S1615S1716R117S1818R63.2LR分析方法描述說明LR分析法的規(guī)約過程是規(guī)范推到的逆過程,所以LR分析過程是一種規(guī)范規(guī)約的過程。其分析過程為:由文法構(gòu)造出該文法項(xiàng)目集,再根據(jù)項(xiàng)目集構(gòu)造該文法的DFA,再判斷是否有移進(jìn)-規(guī)約和規(guī)約-規(guī)約沖突,若沒有沖突則該文法為LR(0)的,若有沖突則該文法是SLR(1)的,最后可以構(gòu)造出LR(0)分析表。然后根據(jù)LR(0)分析表進(jìn)行語法分析,分析過程就是進(jìn)棧和規(guī)約的過程。若能規(guī)約出開始符S,則語法正確。反之,語法錯誤。4、中間代碼形式的描述及中間代碼序列的結(jié)構(gòu)設(shè)計(jì)本系統(tǒng)中所采用的中間代碼形式是四元式,是一種比較普遍采用的形式。四元式的四個組成成分是:算符op,第一和第二運(yùn)算對象ARG1和ARG2及運(yùn)算結(jié)果RESULT。運(yùn)算對象和運(yùn)算結(jié)果有時(shí)指用戶自己定義的變量,有時(shí)指編譯程序引進(jìn)的臨時(shí)變量。例如a:=b*c+b*d的四元式表示如下:1)(*,b,c,t1)2)(*,b,d,t2)3)(+,t1,t2,t3)4)(:=,t3,-,a)四元式對中間結(jié)果的引用必須通過給定的名字,也就是說,四元式的聯(lián)系是通過臨時(shí)變量實(shí)現(xiàn)的。5、編譯系統(tǒng)的概要設(shè)計(jì)詞法分析詞法分析程序要做的工作是:從源程序的第一個字符開始,順序讀字符,一次讀一個,根據(jù)所讀進(jìn)的字符識別各類單詞,同時(shí)去掉源程序中的空白和注釋。詞法分析檢查的錯誤主要是挑出源程序中出現(xiàn)的非法符號。所謂非法符號是指不是程序設(shè)計(jì)語言中允許出現(xiàn)的符號,就像自然語句中的錯字。流程圖如下:結(jié)束符“結(jié)束符“#”界限符開始到輸入流中讀下一字符CharChar是什么?初始化標(biāo)識符和關(guān)鍵字詞法分析子程序字母數(shù)字運(yùn)算符無符號數(shù)詞法分析子程序運(yùn)算符詞法分析子程序界限符詞法分析子程序S’->S·語法分析語法分析是編譯過程的核心部分。它的任務(wù)是在詞法分析識別出單詞符號串的基礎(chǔ)上,分析并判定程序的語法結(jié)構(gòu)是否符合語法規(guī)則。流程圖如下:輸入串輸入串#…ci…c1Sp→##┋┋┋┋X[i]S[i]總控程序輸出ACTION表GOTO表?xiàng)=Y(jié)束其中SP為棧頂指針,S[i]為狀態(tài)棧,X[i]為文法符號棧。狀態(tài)轉(zhuǎn)換表內(nèi)容按關(guān)系GOTO[Si,X]=Sj確定,改關(guān)系式是指當(dāng)前棧頂狀態(tài)為Si遇到當(dāng)前文法符號為X時(shí)應(yīng)轉(zhuǎn)向狀態(tài)Sj。X為終結(jié)符或非終結(jié)符。ACTION[Si,a]規(guī)定了棧頂狀態(tài)為Sj時(shí)遇到輸入符號c[i]應(yīng)該執(zhí)行的動作。動作有以下四種可能:移進(jìn):當(dāng)Sj=GOTO[Si,a]成立,則把Sj移入到文法符號棧。其中i,j表示狀態(tài)號。規(guī)約:當(dāng)在棧頂形成句柄為b時(shí),則用b歸約為相應(yīng)的非終結(jié)符A,即當(dāng)文法中有A->b的產(chǎn)生式,而b的長度為r,則從狀態(tài)棧和文法符號棧中自棧頂向下去掉r個符號。并把A移入文法符號棧內(nèi),再把滿足Sj=GOTO[Si,A]的狀態(tài)移進(jìn)狀態(tài)棧,其中Si為修改指針后的棧頂狀態(tài)。接受acc:當(dāng)歸約到文法符號棧中只剩下文法的開始符號S時(shí),并且輸入符號串已結(jié)束即當(dāng)前輸入符是‘#’,則為分析成功。報(bào)錯:當(dāng)遇到狀態(tài)棧頂為某一狀態(tài)下出現(xiàn)不該遇到的文法符號時(shí),則報(bào)錯,說明輸入串不是該分發(fā)能接受的句子。語法制導(dǎo)翻譯在語法分析過程中,隨著分析的步步進(jìn)展,根據(jù)每個產(chǎn)生式所對應(yīng)的語義子程序(或語義規(guī)則描述的語義動作)進(jìn)行翻譯。屬性文法的每個符號有屬性,所以每個符號入棧時(shí),必須連屬性一起入棧,這樣,棧符號就由文法符號及存放該符號屬性的域所組成。由于屬性類型不同,屬性域存放的內(nèi)容就要根據(jù)屬性的類型來定。有的可能直接存放屬性值,也有的存放的是指向?qū)傩灾档闹羔槨τ诰C合屬性,其屬性域不存放其屬性值,而是存放一個指針,指向存貯該屬性值的單元。對于繼承屬性,其屬性域直接保存其屬性值。繼承屬性的屬性域剛?cè)霔r(shí)為空,但是在該棧符號變成棧頂符號之前的某一時(shí)刻,它們必須接受相應(yīng)的屬性值,即在成為棧頂時(shí),繼承屬性的屬性域必須有值。6.詳細(xì)的算法描述本程序算法描述如下:main(){ Init();Print_LR(); charfilename[20]; cout<<"請輸入文件名:"<<endl; cin>>filename; ifstreamdic(filename,ios::in); while(!dic.eof()) { charm; m=dic.get(); if((m==32)||(m==10)) {} else {sr[q]=m; if(sr[q]=='#') { cout<<"你輸入的程序段為\t\n"; cout.write(sr,q); break; } q++;} }getch(); shuru[0]=sr[0]; for(intk1=1,k2=1;sr[k1]!='\0';k1++) { if(IsLetter(sr[k1])==0&&IsDigit(sr[k1])==0) {shuru[k2]=sr[k1];k2++;} switch(sr[k1-1]) {case'+': case'-': case'*':case'/':case'=':case'%': case'(':case')':case'{':case'}':case'<':case'>':shuru[k2]=sr[k1];k2++;break; case';':if(sr[k1]!='}') {shuru[k2]=sr[k1];k2++;break;} } } for(inti1=2,i2=0;shuru[i1]!='#';i1++) {if(shuru[i1]!='}'&&shuru[i1]!=')') { ch[i2]=shuru[i1]; i2++; } if(shuru[i1]=='}') i1+=2; } for(inti3=0,i5=0;ch[i3]!='#';i3++) { if(ch[i3]=='='||ch[i3+1]=='=') { a[i4]=ch[i3]; i4++; } elseif(ch[i3]!=';') { tmp[i5]=ch[i3]; i5++; } else { tmp[i5]=ch[i3]; i5++; } }LR(); shuchu(); }7軟件的測試方法和測試結(jié)果7.1程序正確運(yùn)行時(shí)的情況如下:在記事本中輸入:do{a=b+3;a=c+2;a=b;}while(a>b)#運(yùn)行結(jié)果如下:7.2運(yùn)行出錯的情況:在記事本中輸入:do{a>b+3;a=c+2;a<b;}while(a>b)#運(yùn)行結(jié)果如下:因?yàn)槲姆ㄖ蠨O語句中的運(yùn)算符只能是=,+。-,*,/,不允許>,<所以會出錯。8研制報(bào)告通過本次的編譯原理的課程設(shè)計(jì),我進(jìn)一步認(rèn)識了LR分析方法,對于大多數(shù)用無二義性的上下文無關(guān)文法描述的語言都可以用相應(yīng)的LR分析器進(jìn)行識別,而且這種方法還具有分析速度快,能準(zhǔn)確、即使地指出出錯的位置。但是它有一個很明顯的缺點(diǎn):對于一個實(shí)用的高級語言程序,文法的分析器的構(gòu)造工作量是相當(dāng)大的。本次課程設(shè)計(jì),我就僅僅只是用了一個簡單的直接文法來構(gòu)造分析表實(shí)現(xiàn)“DO-WHILE循環(huán)語句的翻譯程序設(shè)計(jì)”,因此,有許多的不足之處。此外,在課程設(shè)計(jì)的過程中我又復(fù)習(xí)了一些C++編程的知識點(diǎn),熟悉了一些常用的庫函數(shù),例如:字符函數(shù)庫<cctype>中的isalnum()函數(shù)(如果參數(shù)是字母數(shù)字,即字母或數(shù)字,該函數(shù)返回true)的運(yùn)用可以減少我們自定義一些基本函數(shù)的麻煩。conio.h頭文件,conio是ConsoleInput/Output(控制臺輸入輸出)的簡寫,其中定義了通過控制臺進(jìn)行數(shù)據(jù)輸入和數(shù)據(jù)輸出的函數(shù),主要是一些用戶通過按鍵盤產(chǎn)生的對應(yīng)操作,比如getch()函數(shù)等等。iomanip.h是I/O流控制頭文件,用于格式化的輸出。還熟悉了關(guān)于Stack類的函數(shù)的運(yùn)用,省去了我們自己定義stack函數(shù)的麻煩,只需在頭文件中加入#include<stack>即可??偨Y(jié)下來,此次課程設(shè)計(jì)使我獲益匪淺,在實(shí)踐中點(diǎn)點(diǎn)滴滴的提升了自己的邏輯分析和編程以及調(diào)試程序的能力。9參考文獻(xiàn)教材:張素琴、

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論