條件語句的翻譯程序設(shè)計_第1頁
條件語句的翻譯程序設(shè)計_第2頁
條件語句的翻譯程序設(shè)計_第3頁
條件語句的翻譯程序設(shè)計_第4頁
條件語句的翻譯程序設(shè)計_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

條件語句的翻譯程序設(shè)計

(遞歸下降法、輸出四元式)1、 系統(tǒng)描述(問題域描述)程序設(shè)計的功能利用遞歸下降法完成條件語句IF-THEN-ELSE的語法及語義分析程序。輸出的中間代碼選用四元式。程序開發(fā)程序開發(fā)工具Windows環(huán)境下的VisualC++條件控制的布爾式翻譯出現(xiàn)在條件語句ifEthenS1elseS2中的布爾表達(dá)式E,它的作用僅在于控制對S]和S2的選擇。作為轉(zhuǎn)移條件的布爾式E,我們可以賦予它兩種“出口”,一是“真”的出口,出向S];—是“假”出口,出向S2。1.3程序界面本程序是使用VisualC++語言編輯,由于布爾表達(dá)式關(guān)系多,使程序分析過程太多,本程序只實現(xiàn)很簡單的布爾表達(dá)式的判斷,和簡單的賦值語句處理。所以用戶界面簡明。2、 文法及屬性文法的描述2.1、文法的描述終結(jié)符終結(jié)符VT二{if、<、:二、then、else、id}非終結(jié)符非終結(jié)符VN={S,E}開始符號開始符號S={S}產(chǎn)生式產(chǎn)生式如下:S->id=id|ifEthenSelseSE->id<id2.2、屬性文法的描述2.2.1條件語句的屬性文法產(chǎn)生式語義規(guī)則S->ifEthenSielseS2E.true:二newlabel;E.false:二newlabel;S].next:二S.next;S2.next:二S.next;S.code:二E.cod||gen(E.true )||Si.code||gen(‘goto'S.next)||gen(E.false )||S2.code2.2.2條件語句的翻譯在翻譯if-then-else語句S->ifEthenS1elseS2時,布爾表達(dá)式E的代碼中有這樣的轉(zhuǎn)移指令:若E為真則轉(zhuǎn)移到Si的第一條指令,若E為假則轉(zhuǎn)移到S2的第一條指令。繼承屬性S.next給出了緊接著S的代碼之后將被執(zhí)行的三地址指令的標(biāo)號。在S1的代碼之后有一條明顯的轉(zhuǎn)移指令gotoS.next,但S2之后沒有。3、語法分析方法及中間代碼形式的描述本程序采用語法制導(dǎo)翻譯法,在語法分析的過程中輸出中間代碼。四元代碼采用結(jié)構(gòu)體存放,它是一個帶有五個域的記錄結(jié)構(gòu),這五個域分別稱為label、op、argi、arg2及result和阿address的聯(lián)合體。域label用于存放每一個四元式前面的標(biāo)號,域op包括一個代表運算符的內(nèi)部碼,是一個枚舉類型,argi代表第一個運算符,arg2代表第二個運算符,result或address代表輸出結(jié)果。4、簡要分析與概要設(shè)計本程序?qū)υ~法分析進(jìn)行了簡化,只能輸入IF,ELSE,THEN,〉,=,a-z且是從文件輸入。作為條件語句只能是id>id,作為賦值語句只能是id二id,其中id可以是從a到z的任意小寫字母。程序可以分成兩大塊。首先是詞法分析(由函數(shù)cifa()完成),將輸入轉(zhuǎn)換成一個個單詞存放在一個Token數(shù)組里面。Token結(jié)構(gòu)有兩個域組成,type代表單詞的種別編碼,是一個整數(shù),ch代表單詞的字符屬性(只對id和〉,二有效)。其次是語法分析和四元式輸出模塊,該模塊由兩個遞歸調(diào)用的函數(shù)E()和S()組成,分別對應(yīng)非終結(jié)符號E和S。函數(shù)S有兩個參數(shù),第一個參數(shù)lab代表S的第一個四元式前面的標(biāo)號,第二個參數(shù)next代表S結(jié)束后的第一個四元式的標(biāo)號,這兩個參數(shù)都由主函數(shù)傳入。函數(shù)E有3個參數(shù),第一個參數(shù)lab代表E的第一個四元式前面的標(biāo)號,第二個參數(shù)etrue和第三個參數(shù)efalse分別代表E的真出口和假出口的標(biāo)號。主要算法如下:S(intlab,intnext){if(match(ID)){Chara,ba=ch;nexttoken()match(‘=')nexttoken()match(ID)b=ch;輸出四元式“l(fā)ab:=,b,-,a“輸出四元式“ J,-,-,next”nexttoken();}elseif(match(“IF”)){nexttoken()intetrue=newlabel();intefalse=newlabel();E(lab,etrue,efalse);if(match(THEN)){nexttoken()S(etrue,next);Match(“ELSE”)S(efalse,next);}ElseERROR();}elseERROR();}voidE(intlab,intetrue,intefalse){if(match(ID)){chara,b;a=ch;nexttoken()match(“>”)nexttoken()match(ID)b=cur.ch;

輸出四元式"lab:j>,a,b,etrue”輸出四元式”J,-,-,efalse”Nexttoken();}elseERROR("E()");}主函數(shù)調(diào)用S(-,10000)即可。10000表示最后一條語句的標(biāo)號,-表示沒有標(biāo)號5、軟件的測試方法和測試結(jié)果程序運行后提示輸入待處理的文件名:輸入文件名1.txt,文件1.txt類容如下:IFa>bTHENx=aELSEx=b這是一個不帶有嵌套結(jié)構(gòu)的簡單if語句,輸出結(jié)果如下:命令提示符所使用的產(chǎn)生式:S->iFEthenSeIseSE->a>bS—>x=aG->x=b匹元式二J>,a,b,Ll&&TOC\o"1-5"\h\zJ LI91L100:= XJ LI000L101:= xJ -,L1&&&L1000:-,-,-L=、課程設(shè)計、條件語句-何松華>將文件1.txt的類容換成下面的較復(fù)雜的嵌套的IF語句:IFa>bTHEN

IFc>dTHENx=fELSEx=tELSEIFb>yTHENx=yELSEx=r再次運行程序,輸出結(jié)果如下:齡令提示符所核用的產(chǎn)生式:E->lfEthenSelseSE->a>bE->lfEthenSelseSE->c>dE->x=fE->x=tE->ifEthen£&lseSE->b>yE->x=yE->x=r因元式;J>,a,b,LiaaJ-,L101J,-,-,L103:=,f,xJ,-,-,L1000:=,t,xJ,-,-,L1000L101:J>,b,y,L104J,-,-,L10511104:=,y,xJ,-,-,L1000L105:=,r,x6設(shè)計評價設(shè)計的不足此程序基本上實現(xiàn)了對條件語句的跳轉(zhuǎn)邏輯的翻譯功能,但是能力有限,只能處理if和else配套使用的情況。另外本程序的錯誤處理做的不是很好,有待改善。收獲與體會編譯原理是一門理論性很強(qiáng)的課程,要想設(shè)計一個好的編譯

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論