語(yǔ)義分析和中間代碼生成_第1頁(yè)
語(yǔ)義分析和中間代碼生成_第2頁(yè)
語(yǔ)義分析和中間代碼生成_第3頁(yè)
語(yǔ)義分析和中間代碼生成_第4頁(yè)
語(yǔ)義分析和中間代碼生成_第5頁(yè)
已閱讀5頁(yè),還剩61頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

語(yǔ)義分析和中間代碼生成第一頁(yè),共六十六頁(yè),編輯于2023年,星期一翻譯為中間語(yǔ)言的好處(1)便于進(jìn)行與機(jī)器無關(guān)的代碼優(yōu)化;(2)使編譯程序改變目標(biāo)機(jī)更容易;易于編譯器的移植(3)使編譯程序的結(jié)構(gòu)在邏輯上更為簡(jiǎn)單明確,以中間語(yǔ)言為界面,編譯前端和后端的接口更清晰。第二頁(yè),共六十六頁(yè),編輯于2023年,星期一主要內(nèi)容中間語(yǔ)言的形式后綴式,圖表方法,三元式編譯過程中不同語(yǔ)言的翻譯或處理方法說明語(yǔ)句的翻譯賦值語(yǔ)句的翻譯布爾表達(dá)式的翻譯控制語(yǔ)句的翻譯第三頁(yè),共六十六頁(yè),編輯于2023年,星期一7.1中間語(yǔ)言中間語(yǔ)言的形式:逆波蘭表示:后綴式圖表示法:DAG和AST三地址代碼:四元式、三元式、間接三元式

第四頁(yè),共六十六頁(yè),編輯于2023年,星期一7.1.1后綴式

后綴式表示法又稱逆波蘭表示法。這種方法是,把運(yùn)算量(操作數(shù))寫在前面,把算符寫在后面(后綴)。一個(gè)表達(dá)式的后綴式可以如下定義:(1)如果E是一個(gè)變量或常量,則E的后綴式是E自身。(2)如果E是E1opE2形式的表達(dá)式,這里op是任何二元操作符,則E的后綴式為E1’E2’op,這里E1’

和E2’分別為E1和E2的后綴式。(3)如果E是(E1)形式的表達(dá)式,則E1的后綴式就是E的后綴式。第五頁(yè),共六十六頁(yè),編輯于2023年,星期一后綴式的優(yōu)點(diǎn)

便于計(jì)算機(jī)處理,因?yàn)樵诤缶Y式中,表達(dá)式的求值順序與運(yùn)算符出現(xiàn)的順序一致,這樣只要用一個(gè)棧就可以實(shí)現(xiàn)表達(dá)式的求值。實(shí)現(xiàn)過程:自左向右掃描后綴表達(dá)式;遇到運(yùn)算對(duì)象入棧,遇到N元運(yùn)算符,就從棧頂取出N個(gè)運(yùn)算對(duì)象進(jìn)行計(jì)算,再將結(jié)果入棧;當(dāng)全部后綴表達(dá)式掃描結(jié)束,則棧頂?shù)闹导礊楸磉_(dá)式結(jié)果。第六頁(yè),共六十六頁(yè),編輯于2023年,星期一后綴式特點(diǎn):無括號(hào)運(yùn)算對(duì)象的順序與中綴式一致根據(jù)操作符(運(yùn)算符)的優(yōu)先級(jí)和結(jié)合性進(jìn)行相關(guān)的處理例:5+4*6546*+第七頁(yè),共六十六頁(yè),編輯于2023年,星期一7.1.2圖表示法圖表示法包括DAG與AST(抽象語(yǔ)法樹)。有向無環(huán)圖(DirectedAcyclicGraph,簡(jiǎn)稱DAG).與抽象語(yǔ)法樹一樣,對(duì)于表達(dá)式中的每個(gè)子表達(dá)式,DAG圖中都有一個(gè)結(jié)點(diǎn)。一個(gè)內(nèi)部結(jié)點(diǎn)代表一個(gè)操作符,它的孩子代表操作數(shù)。兩者不同的是,在DAG圖中代表公共子表達(dá)式的結(jié)點(diǎn)具有多個(gè)父結(jié)點(diǎn),而在一棵抽象語(yǔ)法樹中公共子表達(dá)式被表示為重復(fù)的子樹。例:第八頁(yè),共六十六頁(yè),編輯于2023年,星期一5+4*6的DAG圖5+64*5+4*6+4*6的DAG圖5+64*+5+4*6+4*6的AST圖5+64*+64*第九頁(yè),共六十六頁(yè),編輯于2023年,星期一后綴式與抽象語(yǔ)法樹的關(guān)系后綴式是抽象語(yǔ)法樹的線性表示:每個(gè)結(jié)點(diǎn)都是在它的所有子節(jié)點(diǎn)之后立即出現(xiàn)的。通過對(duì)抽象語(yǔ)法樹的不同形式的遍歷可以形成不同形式的綴式表達(dá)式前序遍歷:前綴式中序遍歷:中綴式后序遍歷:后綴式5+64*+64*第十頁(yè),共六十六頁(yè),編輯于2023年,星期一產(chǎn)生賦值語(yǔ)句抽象語(yǔ)法樹的屬性文法S.nptr:=mknode('assign',mkleaf(id,id.place),E.nptr)

E.nptr:=mknode('+',E1.nptr,E2.nptr)E.nptr:=mknode('*',E1.nptr,E2.nptr)mkleaf(id,id.place)S→id:=EE→E1+E2E→E1*E2

E->id產(chǎn)生式語(yǔ)義規(guī)則第十一頁(yè),共六十六頁(yè),編輯于2023年,星期一S.nptr:=mknode('assign',mkleaf(id,id.place),E.nptr)

E.nptr:=mknode('+',E1.nptr,E2.nptr)E.nptr:=mknode('*',E1.nptr,E2.nptr)E.nptr:=mkleaf(id,id.place)mkleaf(id,id.place)S→id:=EE→E1+E2E→E1*E2E->id

a:=b+cabc+:=第十二頁(yè),共六十六頁(yè),編輯于2023年,星期一抽象語(yǔ)法樹的存儲(chǔ)表示二叉樹的形式:算術(shù)運(yùn)算通常都是二元運(yùn)算樹中每個(gè)節(jié)點(diǎn)包含三個(gè)域:數(shù)組的形式表示:每一個(gè)數(shù)組元素形式如下:節(jié)點(diǎn)類型|操作數(shù)1|操作數(shù)2節(jié)點(diǎn)類型|操作數(shù)1|操作數(shù)2第十三頁(yè),共六十六頁(yè),編輯于2023年,星期一*

uminus

id

c

id

b

賦值語(yǔ)句:a:=b*-c+b*-c后綴式:abcuminus*bcuminus*+assignassign

+

*

uminus

id

a

id

c

id

b

idb

idcunimus1*02

idb

idc

unimus5

*46

+37

ida

assign98

...

第十四頁(yè),共六十六頁(yè),編輯于2023年,星期一7.1.3三地址代碼三地址代碼是由下面一般形式的語(yǔ)句構(gòu)成的序列:X:=yopz

其中,x、y、z為名字、常數(shù)或編譯時(shí)產(chǎn)生的臨時(shí)變量(存放中間結(jié)果,對(duì)應(yīng)于語(yǔ)法樹的內(nèi)部節(jié)點(diǎn));

op代表運(yùn)算符號(hào)如定點(diǎn)運(yùn)算符、浮點(diǎn)運(yùn)算符、邏輯運(yùn)算符等。每個(gè)語(yǔ)句的右邊只能有一個(gè)運(yùn)算符。每條語(yǔ)句通常包含三個(gè)地址:兩個(gè)操作數(shù)地址,一個(gè)操作結(jié)果地址第十五頁(yè),共六十六頁(yè),編輯于2023年,星期一三地址碼示例t1:=-ct2:=b*t1t3:=-ct4:=b*t3t5:=t2+t4a:=t5assigna+*bcuminus*uminuscba:=b*-c+b*-c第十六頁(yè),共六十六頁(yè),編輯于2023年,星期一三地址碼示例(2)assigna+*bcuminust1:=-ct2:=b*t1t5:=t2+t2a:=t5

a:=b*-c+b*-c第十七頁(yè),共六十六頁(yè),編輯于2023年,星期一三地址代碼的具體表示1.四元式:op,arg1,arg2,result(0)(1)(2)(3)(4)(5)uminus*uminus*+assigncbcbt2t5arg1t1t3t4arg2resultt1t2t3t4t5aop

t1:=-ct2:=b*t1t3:=-ct4:=b*t3t5:=t2+t4a:=t5a:=b*(-c)+b*(-c)第十八頁(yè),共六十六頁(yè),編輯于2023年,星期一三地址代碼的具體表示2.三元式:op,arg1,arg2(0)(1)(2)(3)(4)(5)uminus*uminus*+assigncbcb(1)aarg1(0)(2)(3)(4)arg2op

t1:=-ct2:=b*t1t3:=-ct4:=b*t3t5:=t2+t4a:=t5a:=b*(-c)+b*(-c)第十九頁(yè),共六十六頁(yè),編輯于2023年,星期一三地址代碼的具體表示3.間接三元式:間接碼表+三元式表目的:便于優(yōu)化處理t1:=-ct2:=b*t1t3:=-ct4:=b*t3t5:=t2+t4a:=t5(1)(2)(3)(4)uminus*+assigncb(2)aarg1(1)(2)(3)arg2op間接代碼表(1)(2)(1)(2)(3)(4)a:=b*(-c)+b*(-c)第二十頁(yè),共六十六頁(yè),編輯于2023年,星期一t1:=a+bt2:=t1*cX:=t2t3:=a+bt4:=d^t3Y:=t4(1)(2)(3)(4)(5)+*:=^:=a(1)xdYarg1bc(2)(1)(4)arg2op間接代碼表(1)(2)(3)(1)(4)(5)X:=(a+b)*cY:=d^(a+b)第二十一頁(yè),共六十六頁(yè),編輯于2023年,星期一語(yǔ)義分析中各種語(yǔ)句的處理說明語(yǔ)句的翻譯賦值語(yǔ)句的翻譯布爾表達(dá)式的翻譯控制語(yǔ)句的翻譯第二十二頁(yè),共六十六頁(yè),編輯于2023年,星期一7.2說明語(yǔ)句的翻譯說明語(yǔ)句的處理方式:不生成可執(zhí)行代碼,只涉及符號(hào)表的操作。說明語(yǔ)句的處理:對(duì)每個(gè)局部名字,在符號(hào)表中建立相應(yīng)的表項(xiàng),填寫有關(guān)的信息如類型、嵌套深度、相對(duì)地址等。相對(duì)地址:相對(duì)靜態(tài)數(shù)據(jù)區(qū)基址或活動(dòng)記錄中局部數(shù)據(jù)區(qū)基址的一個(gè)偏移值。第二十三頁(yè),共六十六頁(yè),編輯于2023年,星期一因?yàn)槊窟M(jìn)入一次過程需分配一次內(nèi)存,因此在處理過程內(nèi)的說明語(yǔ)句時(shí),要分配每個(gè)標(biāo)識(shí)符的相對(duì)地址。設(shè)變量offset用來記錄相對(duì)地址,每次進(jìn)入一個(gè)過程,先將offset置為0。每次遇到一個(gè)新名字,則把名字同offset的當(dāng)前值一起錄入符號(hào)表,然后offset的值增加,其增加的值由該名字的數(shù)據(jù)類型所決定,稱為數(shù)據(jù)對(duì)象的寬度,用屬性width表示。假設(shè)integer型對(duì)象寬度為4,real型對(duì)象寬度為8,則下表為過程中說明語(yǔ)句的翻譯方案。第二十四頁(yè),共六十六頁(yè),編輯于2023年,星期一過程中的說明語(yǔ)句的翻譯P→D {offset:=0}

D→D;DD→id:T {enter(,T.type,offset); offset:=offset+T.width}T→integer {T.type:=integer;T.width:=4}T→real {T.type:=real;T.width:=8}T→array[num]ofT1{T.type:=array(num.val,T1.type); T.width:=num.val*T1.width}

T→↑T1 {T.type:=pointer(T1.type);

T.width:=4}第二十五頁(yè),共六十六頁(yè),編輯于2023年,星期一7.3賦值語(yǔ)句的翻譯在本節(jié)中賦值語(yǔ)句中的表達(dá)式的類型可以是整型、實(shí)型、數(shù)組和記錄。作為翻譯賦值語(yǔ)句為三地址代碼的一部分,我們將主要討論:

簡(jiǎn)單賦值語(yǔ)句的翻譯

第二十六頁(yè),共六十六頁(yè),編輯于2023年,星期一7.3.1簡(jiǎn)單算術(shù)表達(dá)式及賦值語(yǔ)句的翻譯所討論的簡(jiǎn)單賦值語(yǔ)句不包含對(duì)數(shù)組元素、記錄元素的引用,僅包含對(duì)簡(jiǎn)單變量的算術(shù)表達(dá)式的引用。并且假定賦值語(yǔ)句中所有變量均為同一類型,不必考慮類型轉(zhuǎn)換的問題。簡(jiǎn)單賦值語(yǔ)句的文法G[s]如下:S→id:=EE→E+T|TT→T*F|FF→(E)|id分析文法G[S],可以看到文法中包含兩類不同語(yǔ)義操作的產(chǎn)生式,一類含有運(yùn)算符操作,一類僅含有傳值操作。因此,要使語(yǔ)義分析后能產(chǎn)生三地址語(yǔ)句中間代碼,應(yīng)該對(duì)這兩類不同的產(chǎn)生式進(jìn)行不同的處理,含有運(yùn)算符操作的產(chǎn)生式的語(yǔ)義動(dòng)作應(yīng)該產(chǎn)生相應(yīng)的三地址語(yǔ)句,而僅含有傳值操作的產(chǎn)生式則只進(jìn)行傳值的語(yǔ)義處理。根據(jù)這種思想,可以構(gòu)造出各產(chǎn)生式的語(yǔ)義子程序如下表所示。第二十七頁(yè),共六十六頁(yè),編輯于2023年,星期一產(chǎn)生賦值語(yǔ)句三地址代碼的翻譯模式S→id:=E {p:=lookup(); ifp<>nilthenemit(p':='E.place)elseerror}E→E1+E2 {E.place=newtemp;

emit(E.place':='E1.place'+'E2.place')}E→E1*E2 {E.place=newtemp;

emit(E.place':='E1.place'*'E2.place')}E→-E {E.place:=newtemp; emit(E.place′:=′′uminus′E1.place}E→(E1) {E.place:=E1.place}E→id {p:=lookup(); ifp<>nilthenE.place:=pelseerror}有關(guān)說明:(1)語(yǔ)義變量E.place:表示存放E值的變量名在符號(hào)表的位置或一整數(shù)碼(若此變量是一個(gè)臨時(shí)變量);

(2)語(yǔ)義變量id.name:表示單詞id的名字;

(3)語(yǔ)義過程newtemp:表示生成一個(gè)臨時(shí)變量,每調(diào)用一次,生成一新的臨時(shí)變量;

(4)語(yǔ)義過程lookup:表示檢查id.name是否出現(xiàn)在符號(hào)表中,若在則返回一指向該登記項(xiàng)的指針,否則返回nil:

(5)語(yǔ)義過程emit:表示產(chǎn)生三地址語(yǔ)句并輸出到文件上。第二十八頁(yè),共六十六頁(yè),編輯于2023年,星期一t1:=-ct2:=b*t1t3:=-ct4:=b*t3t5:=t2+t4a:=t5assigna+*bcuminus*uminuscba:=b*-c+b*-c產(chǎn)生賦值語(yǔ)句三地址代碼的翻譯模式S→id:=E{p:=lookup(); ifp<>nilthenemit(p':='E.place)elseerror}E→E1+E2{E.place=newtemp;

emit(E.place':='E1.place'+'E2.place')}E→E1*E2{E.place=newtemp;

emit(E.place':='E1.place'*'E2.place')}E→-E {E.place:=newtemp; emit(E.place′:=′′uminus′E1.place}E→(E1){E.place:=E1.place}E→id {p:=lookup(); ifp<>nilthenE.place:=pelseerror}第二十九頁(yè),共六十六頁(yè),編輯于2023年,星期一7.4布爾表達(dá)式的翻譯布爾表達(dá)式:

用布爾運(yùn)算符號(hào)(and,or,not)作用到布爾變量或關(guān)系表達(dá)式上而組成。布爾表達(dá)式的作用:

1.用作計(jì)算邏輯值

2.用作控制流語(yǔ)句如if-then,if-then-else和while-do等之中的條件表達(dá)式第三十頁(yè),共六十六頁(yè),編輯于2023年,星期一◆一個(gè)布爾表達(dá)式的值的計(jì)算

方法一:用數(shù)值表示真和假,從而對(duì)布爾表達(dá)式的求值,可以象對(duì)算術(shù)表達(dá)式的求值那樣一步一步地來計(jì)算

方法二:優(yōu)化的方法。AorB解釋成ifAthentrueelseBAandB解釋成ifAthenBelsefalsenotA解釋成ifAthenfalseelsetrue第三十一頁(yè),共六十六頁(yè),編輯于2023年,星期一7.4.1數(shù)值表示法的翻譯(用作計(jì)算邏輯值)用1表示真,0表示假來實(shí)現(xiàn)布爾表達(dá)式的翻譯例如,布爾表達(dá)式:aorbandnotc

翻譯成三地址代碼序列:

100:t1:=notc101:t2:=bandt1102:t3:=aort1oraandbcnot第三十二頁(yè),共六十六頁(yè),編輯于2023年,星期一關(guān)系表達(dá)式:a<b等價(jià)于ifa<bthen1else0翻譯成三地址代碼序列:

100:ifa<bgotol03

101:t:=0102:gotol04

103:t:=1104:

第三十三頁(yè),共六十六頁(yè),編輯于2023年,星期一關(guān)于布爾表達(dá)式的數(shù)值表示法的翻譯模式E→E1orE2 {E.place:=newtemp; emit(E.place‘:=‘E1.place‘or’E2.place)}E→E1andE2 {E.place:=newtemp; emit(E.place':='E1.place'and’E2.place)}E→notE1 {E.place:=newtemp;emit(E.place':=''not'E1.place)}第三十四頁(yè),共六十六頁(yè),編輯于2023年,星期一E→id1relopid2注:relop是關(guān)系運(yùn)算符

{E.place:=newtemp;emit('if'id1.placerelop.opid2.place'goto'nextstat+3);emit(E.place':=0');emit('goto'nextstat+2);emit(E.place':=‘'1')}E→ture {E.place:=newtemp;emit(E.place':=''1')}

E→false {E.place:=newtemp;emit(E.place':=''0')}

a<b的翻譯:

100:ifa<bgotol03

101:t:=0102:gotol04

103:t:=1104:

第三十五頁(yè),共六十六頁(yè),編輯于2023年,星期一例:考慮如下語(yǔ)句:X=a<bandc<dore<fa<bEandC<dEor

e<fEEE100:ifa<bgoto103101:t1=0102:goto104103:t1=1104:ifc<dgoto107105:t2=0106:goto108107:t2=1109:ife<fgoto112110:t4=0111:goto113112:t4=1X=S108:T3=t1andt2113:T5=t3ort4114:x:=t5第三十六頁(yè),共六十六頁(yè),編輯于2023年,星期一7.4.2作為條件控制語(yǔ)句的布爾表達(dá)式的翻譯(采用簡(jiǎn)化的方法進(jìn)行布爾表達(dá)式的計(jì)算)文法:ifEthenS1elseS2

E.codeS1.codeE.true:Gotos.nextE.false:toE.truetoE.false生成的代碼結(jié)構(gòu):S2.code……S.next:第三十七頁(yè),共六十六頁(yè),編輯于2023年,星期一控制語(yǔ)句中的條件表達(dá)式翻譯的基本思想給控制語(yǔ)句中的條件表達(dá)式設(shè)兩個(gè)屬性:E.true,和E.false,記錄控制語(yǔ)句所轉(zhuǎn)向的兩個(gè)語(yǔ)句的標(biāo)號(hào)。對(duì)條件表達(dá)式的翻譯如下:E:a<b,生成如下的代碼Ifa<bgotoE.trueGotoE.falseE.codeS1.codeE.true:Gotos.nextE.false:toE.truetoE.falseS2.code……s.next:第三十八頁(yè),共六十六頁(yè),編輯于2023年,星期一控制語(yǔ)句中的條件表達(dá)式翻譯的基本思想假定E形如E1orE2。若E1為真,則立即可知E為真,于是E1.true與E.true是相同的。若El為false則必須對(duì)E2求值,因此我們置E1.false:為E2的代碼的第一條指令的標(biāo)號(hào)。而E2的真、假出口可以分別與E的真、假出口相同。類似可考慮形如E1andE2的E的翻譯。至于形如notE1的布爾表達(dá)式E不必生成新的代碼,只要把E1的假、真出口作為E的真、假出口即可。按此方式可以寫出布爾表達(dá)式譯成三地址代碼的語(yǔ)義規(guī)則。注意E的true和false屬性均為繼承屬性。E:E1orE2E1.true=E.true,E1.false=E2的第一條代碼E2.true=E.true,E2.false=E.false第三十九頁(yè),共六十六頁(yè),編輯于2023年,星期一控制語(yǔ)句中的條件表達(dá)式翻譯的基本思想E:E1orE2E1.true=E.trueE1.false=E2的第一條代碼E2.true=E.trueE2.false=E.falseE1.codeS1.codeE.true:Gotos.nextE.false:toE.truetoE.falseS2.code……s.next:E2.codetoE.truetoE.false第四十頁(yè),共六十六頁(yè),編輯于2023年,星期一控制語(yǔ)句中的條件表達(dá)式翻譯的基本思想E:E1andE2E1.true=E2的第一條語(yǔ)句;E1.false=E.falseE2.true=E.true;E2.false=E.falseE1.codeS1.codeE.true:Gotos.nextE.false:toE.truetoE.falseS2.code……s.next:E2.codetoE.truetoE.false第四十一頁(yè),共六十六頁(yè),編輯于2023年,星期一產(chǎn)生式語(yǔ)義規(guī)則E→E1orE2E1.true:=E.true;E1.false:=newlabel;E2.true:=E.true;E2.false:=E.falseE.code:=E1.code||gen(E1.false’:’)||E2.code第四十二頁(yè),共六十六頁(yè),編輯于2023年,星期一產(chǎn)生式語(yǔ)義規(guī)則E→E1andE2E1.true:=newlabel;E1.false:=E.false;E2.true:=E.true;E2.false:=E.false;E.code:=E1.code‖gen(E1.true’:’)‖E2.codeE→notE1E1.true:=E.false;E1.false:=E.true;E.code:=E1.code第四十三頁(yè),共六十六頁(yè),編輯于2023年,星期一產(chǎn)生式語(yǔ)義規(guī)則E→id1relopid2E.code:=gen(‘if’id1.placerelop.opid2.place‘goto’E.true)||gen(‘goto’E.false)E→trueE.code:=gen(‘goto’E.true)E→falseE.code:=gen(‘goto’E.false)E的true和false屬性都是繼承屬性,E.code是綜合屬性。因此該語(yǔ)義規(guī)則的不能通過一遍掃描完成。E→(E1)E1.true:=E.true;E1.false:=E.false;E.code:=E1.code第四十四頁(yè),共六十六頁(yè),編輯于2023年,星期一例:考慮如下語(yǔ)句:

a<borc<dande<f假定整個(gè)表達(dá)式的真假出口分別置為L(zhǎng)true和Lfalse

a<bEorC<dEande<fEEEifa<bgotoE.truegotoE.falseifc<dgotoE.truegotoE.falseife<fgotoE.truegotoE.falseifc<dgotoE.truegotoE.falseL2:ife<fgotoE.truegotoE.falseifa<bgotoE.truegotoE.falseL1:ifc<dgotoE.truegotoE.falseL2:ife<fgotoE.truegotoE.false第四十五頁(yè),共六十六頁(yè),編輯于2023年,星期一例:考慮如下語(yǔ)句:

a<borc<dande<f假定整個(gè)表達(dá)式的真假出口分別置為L(zhǎng)true和Lfalsea<bEorC<dEande<fEEEifc<dgotoL2gotoLfalseL2:ife<fgotoLtruegotoLfalseifa<bgotoLtruegotoL1L1:ifc<dgotoL2gotoLfalseL2:ife<fgotoLtruegotoLfalseL1:L2:ifa<bgotoE.truegotoE.falseifc<dgotoE.truegotoE.falseife<fgotoE.truegotoE.false第四十六頁(yè),共六十六頁(yè),編輯于2023年,星期一例:考慮如下語(yǔ)句:a<bandc<dore<fa<bEandC<dEore<fEEEifa<bgotoE.truegotoE.falseifc<dgotoE.truegotoE.falseife<fgotoE.truegotoE.falseifa<bgotoE.truegotoE.falseL1:ifc<dgotoE.truegotoE.falseifa<bgotoE.truegotoE.falsel1:ifc<dgotoE.truegotoE.falsel2:ife<fgotoE.truegotoE.falseL1:L2:第四十七頁(yè),共六十六頁(yè),編輯于2023年,星期一例:考慮如下語(yǔ)句:a<bandc<dore<fa<bEandC<dEore<fEEEifa<bgotoE.truegotoE.falseL1:ifc<dgotoE.truegotoE.falseL2:ife<fgotoE.truegotoE.falseL1:L2:ifa<bgotoL1gotoE.falseL1:ifc<dgotoE.truegotoL2L2:ife<fgotoE.truegotoE.false第四十八頁(yè),共六十六頁(yè),編輯于2023年,星期一

我們假設(shè)實(shí)現(xiàn)三地址代碼時(shí)采用四元式形式實(shí)現(xiàn),并且假定:(jnz,a,-,p)表示ifagotop(jrop,x,y,p)表示ifxropygotop(j,-,-,p)表示gotop第四十九頁(yè),共六十六頁(yè),編輯于2023年,星期一控制語(yǔ)句中布爾表達(dá)式的翻譯模式一遍掃描的表達(dá)式翻譯中存在的問題:生成某些轉(zhuǎn)移語(yǔ)句時(shí),轉(zhuǎn)移到的目標(biāo)的標(biāo)號(hào)是未知的解決方案:當(dāng)目標(biāo)語(yǔ)句的標(biāo)號(hào)確定后,進(jìn)行回填第五十頁(yè),共六十六頁(yè),編輯于2023年,星期一用四元式表示1:(j<,a,b,3)2:(j,-,-,6)3:(+,a,1,t1)4:(:=,t1,-,a)5:(j,-,-,8)6:(+,b,1,t2)7:(:=,t2,-,b)8:……例:ifa<bthena:=a+1elseb:=b+1第五十一頁(yè),共六十六頁(yè),編輯于2023年,星期一7.5控制語(yǔ)句的翻譯任何程序都可有順序結(jié)構(gòu)、選擇結(jié)構(gòu)和while循環(huán)結(jié)構(gòu)表示,這三類結(jié)構(gòu)可用如下的文法描述:(1)S→ifEthenS

(2)|ifEthenSelseS

(3)|whileEdoS

(4)|beginLend

(5)|A

(6)L→L;S

(7)|SS表示語(yǔ)句 E為一個(gè)布爾表達(dá)式L表示語(yǔ)句塊A為賦值語(yǔ)句 第五十二頁(yè),共六十六頁(yè),編輯于2023年,星期一控制流語(yǔ)句的翻譯模式:SifEthenS1

的四元式序列

1.(j,E,-,3)2.(j,-,-,q)3.……q.……S1的四元式序列第五十三頁(yè),共六十六頁(yè),編輯于2023年,星期一2.SifEthen

S1elseS2的四元式序列

1.(j,E,-,3)2.(j,-,-,p+1)3.……p.(j,-,-,q)p+1.……q.……

S1的四元式序列S2的四元式序列第五十四頁(yè),共六十六頁(yè),編輯于2023年,星期一3.SwhileEdoS1的四元式序列

1.(j,E,-,3)2.(j,-,-,p+1)3.……p.(j,-,-,1)p+1.……

S1的四元式序列第五十五頁(yè),共六十六頁(yè),編輯于2023年,星期一(4)SbeginLend

(5)SA

(6)L→L;S

(7)SS1語(yǔ)句塊L的四元式序列賦值語(yǔ)句A的四元式序列語(yǔ)句塊L的四元式序列語(yǔ)句S的四元式序列語(yǔ)句S1的四元式序列第五十六頁(yè),共六十六頁(yè),編輯于2023年,星期一翻譯為四元式例:將語(yǔ)句ifa<borc<dande<fthens1elses21(j<,a,b,?)2(j,-,-,?)3(j<,c,d,?)4(j,-,-

?)5(j<,e,f,?)6(j,-,-,?)7S1的四元式序列

……p(j,-,-,?)p+1S2的四元式序列

……q……1(j<,a,b,7)2(j,-,-,3)3(j<,c,d,5)4(j,-,-

p+1)5(j<,e,f,7)6(j,-,-,p+1)7S1的四元式序列

……p(j,-,-,q)第五十七頁(yè),共六十六頁(yè),編輯于2023年,星期一例:考慮如下語(yǔ)句:

whilea<bdoifc<dthenx:=y+z100(j<,a,b,?)101(j<,--,--,?)106(j,--,--,100)104(+,y,z,T)105(:=,T,--,x)102(j<,c,d,?)103(j<,--,--,?)102(j<,c,d,104)103(j<,--,--,?

溫馨提示

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