cmpl07old市公開課一等獎?wù)n件名師大賽獲獎?wù)n件_第1頁
cmpl07old市公開課一等獎?wù)n件名師大賽獲獎?wù)n件_第2頁
cmpl07old市公開課一等獎?wù)n件名師大賽獲獎?wù)n件_第3頁
cmpl07old市公開課一等獎?wù)n件名師大賽獲獎?wù)n件_第4頁
cmpl07old市公開課一等獎?wù)n件名師大賽獲獎?wù)n件_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章語義分析和中間代碼產(chǎn)生內(nèi)容:將屬性文法和語法制導(dǎo)翻譯技術(shù)應(yīng)用于語義分析和中間代碼產(chǎn)生。任務(wù):1.靜態(tài)語義檢查:類型檢查,控制流檢查,一致性檢查,有關(guān)名字檢查,作用域分析等。2.翻譯:產(chǎn)生中間代碼,優(yōu)化。地位:

語法分析器

靜態(tài)檢查器

中間代碼產(chǎn)生器

優(yōu)化器

8/11/20241語義分析和中間代碼生成概述一種源程序通過詞法分析、語法分析之后,表明該源程序在書寫上是對的的,并且符合程序語言所規(guī)定的語法。但是語法分析并未對程序內(nèi)部的邏輯含義加以分析,因此編譯程序接下來的工作是語義分析。編譯中的語義解決是指兩個功效:第一,審查每個語法構(gòu)造的靜態(tài)語義,即驗證語法構(gòu)造正當?shù)某绦蚺c否真正故意義。有時把這個工作稱為靜態(tài)語義分析或靜態(tài)審查。第二,如果靜態(tài)語義對的,語義解決則要執(zhí)行真正的翻譯,即,或者將源程序翻譯成程序的一種中間表達形式(中間代碼),或者將源程序翻譯成目的代碼。8/11/20242語義分析和中間代碼生成類型檢查。驗證程序中執(zhí)行的每個操作與否恪守語言的類型系統(tǒng)的過程,編譯程序必須報告不符合類型系統(tǒng)的信息??刂屏鳈z查??刂屏髡Z句必須使控制轉(zhuǎn)移到正當?shù)牡胤健?/p>

例如,在C語言中break語句使控制跳離涉及該語句的最小while、for或switch語句。如果不存在涉及它的這樣的語句,則就報錯。一致性檢查。在諸多場合規(guī)定對象只能被定義一次。例如Pascal語言規(guī)定同一標記符在一種分程序中只能被闡明一次,同一case語句的標號不能相似,枚舉類型的元素不能重復(fù)出現(xiàn)等等。有關(guān)名字檢查。有時,同一名字必須出現(xiàn)兩次或多次。例如,Ada語言程序中,循環(huán)或程序塊能夠有一種名字,出現(xiàn)在這些構(gòu)造的開頭和結(jié)尾,編譯程序必須檢查這兩個地方用的名字是相似的。名字的作用域分析靜態(tài)語義分析普通涉及8/11/20243語義分析和中間代碼生成中間代碼所謂中間代碼,也稱中間語言,是復(fù)雜性介于源程序語言和機器語言的一種表達形式。為什么有的編譯程序直接生成目的代碼,有的編譯程序采用中間代碼。普通,快速編譯程序直接生成目的代碼,沒有將中間代碼翻譯成目的代碼的額外開銷。但是為了使編譯程序構(gòu)造在邏輯上更為簡樸明確,常采用中間代碼,這樣能夠?qū)⑴c機器有關(guān)的某些實現(xiàn)細節(jié)置于代碼生成階段認真解決,并且能夠在中間代碼一級進行優(yōu)化工作使得代碼優(yōu)化比較容易實現(xiàn)。8/11/20244語義分析和中間代碼生成

§7.1中間語言7.1.1后綴式(逆波蘭式)1.定義(1)如果E是一種常量或變量,則E的后綴式是E本身。(2)如果E是E1opE2形式的體現(xiàn)式,則E的后綴式是E1‘E2‘op,這里E1‘E2‘是E1、E2的后綴式。2.例:(a+b)*(c+d)的后綴式是:ab+cd+*3.把體現(xiàn)式翻譯成后綴式的屬性文法8/11/20245語義分析和中間代碼生成7.1.2圖表達法涉及DAG與抽象語法樹(AST)。1.無循環(huán)有向圖(DAG—DirectedAcyclicGragh)DAG與AST的區(qū)別是DAG能夠有公共子體現(xiàn)式(結(jié)點可有多個父結(jié)點)。例:體現(xiàn)式a:=b*(-c)+b*(-c)的AST和DAG圖及三地址碼T1:=-c:=:=T1:=-cT2:=b*T1/\/\T2:=b*T1T3:=-ca+T5a+T3T3:=T2+T2T4:=b*T3/\()a:=T3T5:=T2+T4*T2*T4*T2a:=T5/\/\/\bT1bT3bT1|||-c-c-c8/11/20246語義分析和中間代碼生成7.1.2圖表達法(2)

2.產(chǎn)生建立賦值語句抽象語法樹的屬性文法 產(chǎn)生式 語義規(guī)則S→id:=ES.nptr:=mknode(‘a(chǎn)ssign”,mkleaf(id.id.place),E.nptr) E→E1+E2 E.nptr:=mknode(‘+’,E1.nptr,E2.nptr) E→E1*E2E.nptr:=mknode(‘*’,E1.nptr,E2.nptr) E→-E1E.nptr:=mknode(‘uminus’,E1.nptr) E→(E1)E.nptr:=E1.nptr E→idE.nptr:=mkleaf(id,id.place)

8/11/20247語義分析和中間代碼生成7.1.2圖表達法(3)例體現(xiàn)式a:=b*-c+b*-c的抽象語法樹的表達:

8/11/20248語義分析和中間代碼生成7.1.3三地址代碼(1)普通形式:(1)x:=yopz(2)x:=opz(3)x:=y(4)gotoL(5)ifxrelopygotoL或ifxgotoL(6)paramxcallp,nreturny(7)x:=y[i],x[i]:=y(8)x:=&y,x:=*y,*x:=y例:體現(xiàn)式a:=b*-c+b*-c的三地址代碼8/11/20249語義分析和中間代碼生成7.1.3三地址代碼(2)產(chǎn)生建立賦值語句三地址代碼屬性文法: 產(chǎn)生式 語義規(guī)則S→id:=ES.code:=E.code||gen(id.place’:=‘E.place) E→E1+E2

E.place:=newtempE.code:=E1.code||E2.code||gen(E.place’:=‘E1.place‘+’E2.place) E→E1*E2E.place:=newtempE.code:=E1.code||E2.code||gen(E.place’:=‘E1.place‘*’E2.place) E→-E1E.place:=newtempE.code:=E1.code||gen(E.place’:=‘’uminus’E1.place)E→(E1)E.place:=E1.placeE.code:=E1.codeE→idE.place:=id.placeE.code:=‘‘8/11/202410語義分析和中間代碼生成7.1.4三地址代碼的三種表達辦法(1)例體現(xiàn)式a:=b*-c+b*-cd的三地址代碼對應(yīng)的1.四元式:用四個域的統(tǒng)計表達2.三元式:用三個域的統(tǒng)計表達8/11/202411語義分析和中間代碼生成7.1.4三地址代碼的三種表達辦法(2)3.間接三元式:用三個域的統(tǒng)計和一種間接碼表表達。語義規(guī)則中應(yīng)增加產(chǎn)生間接碼表的動作。例:X:=(A+B)*C;Y:=D(A+B)間接代碼三元式表(1)(2)(3)(1)(4)(5)四元式、三元式和間接三元式的比較。8/11/202412語義分析和中間代碼生成§7.2闡明語句7.2.1過程中的闡明語句(單層)P{offset:=0}DDD;DDid:T{enter(,T.type,offset);offset:=offset+T.width}Tinteger{T.type:=integer;T.width:=4}Treal{T.type:=real;T.width:=8}Tarray[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}8/11/202413語義分析和中間代碼生成7.2.2 保存作用域信息(嵌套)(1)(1)programsort(input,output);(2)vara:array[0..10]ofinteger;(3)x:integer;(4)procedurereadarray;(5)vari:integer;(6)begin…a…end{readarray};(7)procedure

exchange(i,j:integer);(8)begin(9)x

a[i](10)end{exchange};(11)procedurequicksortm,n:integer);(12)vark,v:integer;(13)functionpartition(y,z:integer):integer;(14)vari,j:integer;(15)begin…a…v…exchange(i,j);…end(partition};(16)begin…end{quicksort};(17)begin…end{sort}.8/11/202414語義分析和中間代碼生成7.2.2 保存作用域信息(2)

源程序8/11/202415語義分析和中間代碼生成7.2.2 保存作用域信息(3)帶嵌套的過程闡明的闡明語句的文法:PDDD;D|id:T|procid;D;S思路:*用一種棧tblptr管理符號表指針,用棧offset管理每個符號表的現(xiàn)在寬度*每一種過程都有一張符號表,即每碰到procid;時便創(chuàng)立一張新的符號表,返回指向外層的指針。*碰到D中的全部闡明都填入現(xiàn)在符號表。*在procid;D;S結(jié)束時,現(xiàn)在符號表填完,彈出tblptr和offset棧頂元素。并把id的項填入外層表,建立外層到現(xiàn)在符號表的指針。8/11/202416語義分析和中間代碼生成7.2.2 保存作用域信息(4)帶嵌套的過程闡明語句的翻譯:PMD{addwidth(top(tblptr),top(offset));pop(tblptr);pop(offset)}/撤銷最外層符號表/M{t:=mktable(nil);push(t,tblptr);push(0,offset)}/建最外層符號表/DD1;D2Dprocid;ND1;S{t:=top(tblptr);addwidth(t,top(offset));pop(tblptr);pop(offset);enterproc(top(tblptr),,t)}/一種過程結(jié)束時,計算該過程總寬度,并把該過程名字填入外層表中/Did:T{enter(top(tblptr),,T.type,top(offset));top(offset):=top(offset)+T.width}/id入表/N{t:=mktable(top(tblptr));push(t,tblptr);push(0,offset)}/進入新的一層符號表/8/11/202417語義分析和中間代碼生成7.2.3統(tǒng)計中的域名統(tǒng)計的文法:TrecordLDend統(tǒng)計闡明的翻譯:TrecordLDend{T.type:=record(top(tblptr));T.width:=top(offset);pop(tblptr);pop(offset)}L{t:=mktable(nil);push(t,tblptr);push(0,offset))}8/11/202418語義分析和中間代碼生成§7.3賦值語句的翻譯7.3.1 簡樸算術(shù)體現(xiàn)式及賦值語句Sid:=E{p:=lookup();ifp≠nilthenemit(p’:=’E.place)elseerror}EE1+E2{E.place:=newtemp;emit(E.place’:=’E1.place‘+’E2.place)}EE1*E2{E.place:=newtemp;emit(E.place‘:=’E1.place‘*’E2.place)}E-E1{E.place:=newtemp;emit(E.place‘:=’‘uminus’E1.place)}Eid{p:=lookup();ifp≠nilthenE.place:=pelseerror}8/11/202419語義分析和中間代碼生成7.3.2數(shù)組元素的引用(1)按行持續(xù)寄存,靜態(tài)存儲以下:一維數(shù)組中,A[i]元素的地址:base+(i-low)×w=i×w+(base-low×w)=i×w+C二維數(shù)組中,A[i1,i2]元素的地址:base+((i1-low1)×n2+i2-low2)×w=((i1×n2)+i2)×w+(base-((low1×n2)+low2)×w)=(i1×n2)+i2)×w+Ck維數(shù)組中,A[i1,i2,…ik]元素的地址:((…(i1n2+i2)n3+i3)…)nk+ik)×w+base-…((low1n2+low2)n3+low3)…)nk+lowk)×w=((…(i1n2+i2)n3+i3)…)nk+ik)×w+C8/11/202420語義分析和中間代碼生成7.3.2數(shù)組元素的引用(2)下標變量的定義:Lid[Elist]|idElistElist,E|E/下標體現(xiàn)式表Elist無法得到數(shù)組的定義信息/改寫為:LElist]|idElistElist,E|id[E/下標體現(xiàn)式表Elist通過子節(jié)點得到數(shù)組的定義信息/8/11/202421語義分析和中間代碼生成7.3.2數(shù)組元素的引用(3)

翻譯模式:1.S

L:=E{ifL.offset=nullthenemit(L.place‘:=’E.place)elseemit(L.place‘[‘L.offset‘]’‘:=’E.place)}2.E

E1+E2{E.place:=newtemp;emit(E.place‘:=’E1place‘+’E2.place)}3.E

(E1){E.place:=E1.place}4.E

L{ifL.offset=nullthenE.place:=L.placeelsebeginE.place:=newtemp;emit(E.place‘:=’L.place‘[‘L.offset‘]’)end}5.L

Elist]{L.place:=newtemp;emit(L.place‘:=’Elist.array‘-’C);L.offset:=newtemp;emit(L.offset‘:=’w‘*’Elist.place)}8/11/202422語義分析和中間代碼生成7.3.2數(shù)組元素的引用(4)6.L

id{L.place:=id.place;L.offset:=null}7.Elist

Elist1,E{t:=newtemp;m:=Elist1.ndim+1;emit(t‘:=’Elist1.place‘*’limit(Elist1.array,m));emit(t‘:=’t‘+’E.place);//lowi*ni+1+lowi+1Elist.array:=Elist1.array;Elist.place:=t;Elist.ndim:=m}8.Elist

id[E{Elist.place:=E.place;Elist.ndim:=1;Elist.array:=id.place}//記下數(shù)組的基本信息前半部分8/11/202423語義分析和中間代碼生成7.3.2數(shù)組元素的引用(5)例7.1設(shè)A為一種10×20的數(shù)組,即n1=10,n2=20,并設(shè)w=4,界為1.對賦值語句x:=A[y,z]的帶注釋的語法分析樹及三地址代碼.S/|\L.place=x:=E.place=T4T1:=y×20L.offset=null|T1:=T1+z//y*20+z|L.place=T2T2:=A-84//(1×20+1)×4=84xL.offset=T3T3:=4×T1//(y*20+z)*4/\T4:=T2[T3]Elist.place=T1]x:=T4Elist.ndim=2Elist.array=A/|\Elist.place=y,E.place=zElist.ndim=1|Elist.array=AL.place=z/|\L.offset=nullA[E.place=y||zL.place=yL.offset=null|y8/11/202424算術(shù)體現(xiàn)式和賦值語句中的類型檢查(1)體現(xiàn)式運算或規(guī)定同類型,或產(chǎn)生有關(guān)類型轉(zhuǎn)換的指令。例:設(shè)x,y為實型,i,j為整型,則體現(xiàn)式x:=y=i*j的三地址碼是:T1:=iint*jT3:=inttorealT1T2:=yreal+T3x:=T28/11/202425語義分析和中間代碼生成算術(shù)體現(xiàn)式和賦值語句中的類型檢查(2)有關(guān)產(chǎn)生EE1+E2的帶語義檢查的三地址碼的語義動作以下:{E.place:=newtemp;ifE1.type=integerandE2.type=integerthenbeginemit(E.place’:=‘E1.place’int+’E2.place);E.type:=integerendelseifE1.type=realandE2.type=realthenbeginemit(E.place’:=‘E1.place’real+’E2.place);E.type:=realend8/11/202426語義分析和中間代碼生成算術(shù)體現(xiàn)式和賦值語句中的類型檢查(3)ElseifE1.type=integerandE2.type=realthenbeginu:=newtemp;emit(u’:=‘‘inttorealE1.place);emit(E.place’:=‘u‘real+’E2.place);E.type:=realendElseifE1.type=realandE2.type=integerthenbeginu:=newtemp;emit(u’:=‘‘inttorealE2.place);emit(E.place’:=‘E1.place‘real+’u);E.type:=realendelseE.type:=type_error類型檢查(2)8/11/202427語義分析和中間代碼生成7.3.3統(tǒng)計中域的引用用在符號表中查找名字的程序同樣來查找域名。體現(xiàn)式pinfo+1的翻譯過程以下:p是指向某個統(tǒng)計的指針,info是它的一種域,則p.type是pointer(record(t)),p是record(t)類型,t是該統(tǒng)計對應(yīng)的符號表,域名info將在t所指向的符號表中找到。8/11/202428語義分析和中間代碼生成7.4 布爾體現(xiàn)式的翻譯(1)7.4.1 數(shù)值表達法EE1orE2{E.place:=newtemp;Emit(E.place‘:=’E1.place‘or’E2.place)}EE1andE2{E.place:=newtemp;Emit(E.place‘:=’E1.place‘a(chǎn)nd’E2.place)}EnotE1{E.place:=newtemp;Emit(E.place‘:=’‘not’E1.place)}E(E1)(E.place:=E1.place)

8/11/202429語義分析和中間代碼生成7.4 布爾體現(xiàn)式的翻譯(2)E

id1relopid2{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

id{E.place:=id.place}前半部分8/11/202430語義分析和中間代碼生成7.4 布爾體現(xiàn)式的翻譯(3)例7.2根據(jù)數(shù)值表達法對布爾體現(xiàn)式a<borc<dande<f翻譯為三地址代碼.100ifa<bgoto103108ife<fgoto111101T1:=0109T3:=0102goto104110goto112103T1:=1111T3:=1104ifc<dgoto107112T4:=T2andT3105T2:=0113T5:=T1orT4106goto108107T2:=18/11/202431語義分析和中間代碼生成7.4.2作為條件控制的布爾式翻譯(0)條件語句:ifEthenS1elseS2能夠翻譯成以下形式:8/11/202432語義分析和中間代碼生成7.4.2作為條件控制的布爾式翻譯(1)作為轉(zhuǎn)移條件的布爾式,可翻譯為一串跳轉(zhuǎn)指令.例:語句ifa>corb<dthenS1elseS2可譯為ifa>cgotoL2gotoL1L1:ifb<dgotoL2gotoL3L2:(有關(guān)S1的三地址代碼序列)//E.truegotoLnextL3:(有關(guān)S2的三地址代碼序列)//E.falseLnext:8/11/202433語義分析和中間代碼生成7.4.2作為條件控制的布爾式翻譯(2)產(chǎn)生布爾體現(xiàn)式三地址代碼的語義規(guī)則/屬性文法EE1orE2E1.true:=E.true;/E.true是E為真時應(yīng)當執(zhí)行的語句的起始位置/E1.false:=newlabel;/E1.false是E1為假時應(yīng)當執(zhí)行的語句的起始位置,即E2的起始位置/E2.true:=E.true;E2.false:=E.false/E.true和E.false由E所在的環(huán)境擬定/E.code:=E1.code||gen(E1.false‘:’)||E2.codeEE1andE2E1.true:=newlabelE1.false:=E.falseE2.true:=E.trueE2.false:=E.falseE.code:=E1.code||gen(E1.true‘:’)||E2.code8/11/202434語義分析和中間代碼生成7.4.2作為條件控制的布爾式翻譯(3)

E

notE1E1.true:=E.falseE1.false:=E.trueE.code:=E1.codeE

(E1)E1.true:=E.falseE1.false:=E.falseE.code:=E1.codeE

id1relopid2E.code:=gen(‘if’id1.placerelopid2.place‘goto’E.true)||gen(‘goto’E.false)E

trueE.code:=gen(‘goto’E.true)E

falseE.code:=gen(‘goto’E.false)前半部分8/11/202435語義分析和中間代碼生成7.4.2作為條件控制的布爾式翻譯(4)例語句a<borc<dande<f可譯為:ifa<bgotoLtruegotoL1L1:ifc<dgotoL2gotoLfalseL2:ife<fgotoLtruegotoLfalse屬性文法8/11/202436語義分析和中間代碼生成7.4.2作為條件控制的布爾式翻譯(5)產(chǎn)生布爾體現(xiàn)式的四元式代碼的翻譯模式EE1orME2{backpatch(E1.falselist,M.quad);/回填,此時找到了E1為假時應(yīng)當轉(zhuǎn)去的地方/E.truelist:=merge(E1.truelist,E2.truelist);/E.truelist是在擬定了E為真時應(yīng)當去的地方之后需要回填指令的鏈表/E.falselist:=E2.falselist}EE1andME2{backpatch(E1.truelist,M.quad);E.truelist:=E2.truelist;E.falselist:=merge(E1.falselist,E2.falselist)}EnotE1{E.truelist:=E1.falselist;E.falselist:=E1.truelist}E(E1){E.truelist:=E1.truelist;E.falselist:=E1.falselist}8/11/202437語義分析和中間代碼生成7.4.2作為條件控制的布爾式翻譯(6)Eid1relopid2{E.truelist:=makelist(nextquad);/下一條指令需要在確切懂得E為真時應(yīng)當去的地方后回填/E.falselist:=makelist(nextquad+1);/下下一條指令需要在確切懂得E為假時應(yīng)當去的地方后回填/emit(‘j’relop.op‘,’id1.place‘,’id2.place‘,’‘0’)emit(‘j,-,-,0’)}Eid{E.truelist:=makelist(nextquad);E.falselist:=makelist(nextquad+1);emit(‘juz’‘,’id.place‘,’‘_’‘,’‘0’)emit(‘j,-,-,0’)}M{M.quad:=nextquad}前半部分8/11/202438語義分析和中間代碼生成7.4.2作為條件控制的布爾式翻譯(7)例:語句a<borc<dande<f帶注釋的分析樹為:E.t=100.104E.f=103.105//\\E.t=100orM.q=102E.t=104E.f=101|E.f=103.105/|\ξ//\\a<bE.t=102andM.q=104E.t=104E.f=103|E.f=105/|\ξ/|\c<de<f8/11/202439語義分析和中間代碼生成7.4.2作為條件控制的布爾式翻譯(8)

100(j<,a,b,0)101(j,-,-,102)102(j<,c,d,104)103(j,-,-,0)104(j<,e,f.100)105(j,-,-,0)分析樹

8/11/202440語義分析和中間代碼生成§7.5控制語句的翻譯7.5.1控制流語句(1)語句SIFEthenS1|IFEthenS1elseS2|whileEdoSd的代碼構(gòu)造:

8/11/202441語義分析和中間代碼生成7.5.1控制流語句(2)控制流語句的屬性文法S

ifEthenS1E.true:=newlabel;E.false:=S.next;S1.next:=S.next;S.code:=E.code||geu(E.true‘:’)||S1.codeS

ifEthenS1elseS2E.true:=newlabel;E.false:=newlabel;S1.next:=S.next;S2.next:=S.next;S.code:=E.code||gen(E.true‘:’)||S1.code||gen(‘goto’S.next)||gen(E.false‘:’)||S2.code8/11/202442語義分析和中間代碼生成7.5.1控制流語句(3)S

whileEdoS1S.begin:=newlabelE.true:=newlabelE.false:=newlabelS1.next:=S.beginS.code:=gen(S.begin‘:’)||E.code||gen(S.true‘:’)||S1.code||gen(‘goto’S.begin)前半部分8/11/202443語義分析和中間代碼生成7.5.1控制流語句(4)例7.5語句whilea<bdoifc<dthenx:=y+zelsex:=y-z;可翻譯為:L1:ifa<bgotoL2gotoLnextL2:ifc<dgotoL3gotoL4L3:T1:=y+zx:=T1gotoL1L4:T2:=y-zx:=T2gotoL1Lnext:翻譯模式8/11/202444語義分析和中間代碼生成控制語句的一遍翻譯模式(1)

S

ifEthenM1S1NelseM2S2{backpatch(E.truelist,M1.quad);backpatch(E.falselist,M2.quad);S1nextlist:=merge(S1.nextlist,N.nextlist,S2.nextlist)}N

{N.nextlist:=makelist(nextquad);emit(‘j,-,-,-‘)}M

{M.quad:=nextquad}S

ifEthenMS1{backpatch(E.truelist,M.quad);S.nextlist:=merge(E.falselist,S1nextlist)}8/11/202445語義分析和中間代碼生成控制語句的一遍翻譯模式(2)S

whileM1EdoM2S1{backpatch(S1.nextlist,M1.quad);backpatch(E.truelist,M2.quad);S.nextlist:=E.falselistemit(‘j,-,-,’M1.quad)}S

beginLead{S.nextlist:=L.nextlist}S

A{S.nextlist:=makelist()}L

L1;MS{backpatch(L1.nextlist,M.quad);L.nextlist:=S.nextlist}L

S{L.nextlist:=S.nextlist}前半部分8/11/202446語義分析和中間代碼生成控制語句的一遍翻譯模式(3)例7.6語句while(a<b)doif(c<d)thenx:=y+z;可譯為:

100(j<,a,b,102)E1.truelist101(j,-,-,107)E1.falselist=S.nextlist102(j<,c,d,104)E2.truelist103(j,-,-,100)E2.falselist104(+,y,z,t)105(:=,t,-,x)

106(j,-,-,100)107翻譯模式8/11/202447語義分析和中間代碼生成7.5.2 標號與goto語句(1)S

labelSlabel

i:{iflook()=falsethen{enter(,lab,y,addr),backpatch(I.gotolist,nextquad)}elseiflook()=trueandi.def=‘n’then{i.def=‘y’,i.addr=nextqudbackpatch(I.gotolist,nextquad)}elseerror}8/11/202448語義分析和中間代碼生成7.5.2 標號與goto語句(2)S

gotoi{iflookup(I)=falsethen{enter(,lab,n,nextquad),makelist(nextquad)}elseiflook()=trueandi.def=‘n’then{enterlist(i.gotolist,nextquad),emit(j,-,-,i.addr)}

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論