各種語(yǔ)言成分的語(yǔ)法及其翻譯方案示_第1頁(yè)
各種語(yǔ)言成分的語(yǔ)法及其翻譯方案示_第2頁(yè)
各種語(yǔ)言成分的語(yǔ)法及其翻譯方案示_第3頁(yè)
各種語(yǔ)言成分的語(yǔ)法及其翻譯方案示_第4頁(yè)
各種語(yǔ)言成分的語(yǔ)法及其翻譯方案示_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、各種語(yǔ)言成分的語(yǔ)法及其翻譯方案(示例)1.普通聲明語(yǔ)句的翻譯下面是聲明語(yǔ)句的文法:P玲progid(input,output)D;SD玲D;D|List :T|procidD;SList玲List1,id|idT玲integer|real|arrayC of T1| T1|recordDC numC|e聲明語(yǔ)句的翻譯模式:P玲progid(input,output)offset:= 0D ; SD玲D;DD玲id:Tenter(,T.type,offset);offset:=offset+T.widthT玲integerT.type := integer;T.width:= 4T

2、玲realT.type:=real;T.width:=8T玲arraynum ofT1T.type:=array(num.val,T1.type);T.width:=num.valxT.widthT玲個(gè)T1 / 161T.type:=pointer(T.type);T.width:= 4.嵌套過(guò)程中聲明語(yǔ)句的翻譯嵌套過(guò)程聲明語(yǔ)句的產(chǎn)生式。P玲progid(input,output)D;SD玲D;D|id :T|proc id ;D;S(7.1)嵌套過(guò)程聲明語(yǔ)句的翻譯模式:P玲progid(input,output)MD;Saddwidth(top(tblptr),top(offset);pop

3、(tblptr);pop(offset)Met:=mktable(nil);push(t,tblptr);push(0,offset)DOD1;DD玲proc id;ND1;St:=top(tblptr);addwidth(t,top(offset);pop(tblptr);pop(offset);enterproc(top(tblptr),,t)D玲id:Tenter(top(tblptr),,T .type,top(offset);top(offset) :=top(offset) +T.widthNet:=mktable(top(tblptr);push(t,

4、tblptr);push(0,offset).記錄的翻譯下面是生成記錄類(lèi)型的產(chǎn)生式:T玲recordDend生成記錄類(lèi)型的翻譯模式:2 / 16T玲recordLDendT.type:=record(top(tblptr);T.width:=top(offset);pop(tblptr);pop(offset)Let:=mktable(nil);push(t,tblptr);push(0,offset).賦值語(yǔ)句的翻譯下面是典型的賦值語(yǔ)句文法:S玲Left:=EE玲E1+E2|E1*E2| -E1| (E) |LeftLeft玲Elist |idElist玲Elist,E|idE(7.2)賦值

5、語(yǔ)句的翻譯模式:S玲Left:=EifLeft.offset=nullthen/*Left 是簡(jiǎn)單變量 id*/gencode(Left.addr :=E.addr);elsegencode(Left.addr Left.offset :=E.addr) /*Left 是數(shù)組元素*/EE1+E3 / 162E.addr:=newtemp;gencode(E.addr :=El.addr+E.addr)(3)E玲(E1)E.addr:=E.addrE玲LeftifLeft.offset=nullthen/*Left 是簡(jiǎn)單 id*/E.addr:=Left.addrelsebegin /*Lef

6、t 是數(shù)組元素*/E.addr:=newtemp;gencode(E.addr :=Left.addr Left.offset )endLeft玲ElistLeft.addr:=newtemp;/*Left是數(shù)組元素,因此存放基址和位移 */Left.offset:=newtemp;gencode(Left.addr :=c(Elist.array);gencode(Left.offset :=Elist.addr *width(Elist.array) Left玲idLeft.addr:=id.addr;Left.offset:=null Elist玲Elist1,Et:=newtemp;m

7、:=Elistl.ndim+1;gencode(t :=Elist1.addr *limit(Elist4 / 16.array,m); /*計(jì)算 e m-1xnm*/gencode(t :=t +E.addr);/* 計(jì)算+im*/Elist.array:=Elistl.array;Elist.addr:=t;Elist.ndim:=m ElistidE Elist.array:=id.addr;Elist.addr:=E.addr;Elist.ndim:=1.各種控制結(jié)構(gòu)的翻譯布爾表達(dá)式的翻譯布爾表達(dá)式的文法為:BOB1orMB 2 BOB1andMB2(3)BOnotB1 BO(B)5

8、/ 16BOEIrelopEB玲t(yī)rueB玲falseM玲e布爾表達(dá)式的翻譯模式如下所示:BOB1orMB2backpatch(B1.falselist,M.quad);B.truelist:=merge(B1.truelist,B2.truelist);B.falselist:=B2.falselistBOBlandMB2backpatch(B1.truelist,M.quad);B.truelist:=B6 / 162.truelist;B.falselist:=merge(B1.falselist,B2.falselist)(3)B玲notB1B.truelist:=B1.falseli

9、st;B.falselist:=B1.truelistB玲(B1) B.truelist:=B1.truelist;B.falselist:=B1.falselistBOE1relopE2B.truelist:=makelist(nextquad);B.falselist:=makelist(nextquad+1);gencode(ifE1.addrrelop.opE1.addrgoto-);gencode(goto-)(6)BtrueB.truelist:=makelist(nextquad);gencode(goto-)7 / 16 B玲falseB.falselist:=makelist

10、(nextquad);gencode(goto-)M玲&M.quad:=nextquad常用控制流語(yǔ)句的翻譯控制流語(yǔ)句if-then, if-then-else和while-do的文法為:SffB thenS 1SffBthenS lelseS2(3)SwhileBdoS1S玲beginLendS玲AL-L1;SL玲S(7.9)if-then, if-then-else 和 while-do 語(yǔ)句的翻譯模式:S玲ifBthenM1S lNelseM2S2backpatch(B.truelist,M8 / 16l.quad);backpatch(B.falselist,M2.quad);S.ne

11、xtlist:=merge(S1.nextlist,merge(N.nextlist,S2.nextlist)NeN.nextlist:=makelist(nextquad);gencode(goto-)(3)MeM.quad:=nextquadSffBthenMS1backpatch(B.truelist,M.quad);S.nextlist:=merge(B.falselist,Sl.nextlist)(5)SwhileM1BdoM2S1backpatch(S1.nextlist,Ml.quad);backpatch(B.truelist,M2.quad);S.nextlist:=B.fa

12、lselist;gencode(goto,M1.quad)(6)SbeginLendS.nextlist:=L.nextlist9 / 16S玲AS.nextlist:=nilL-L1;MSbackpatch(L1.nextlist,M.quad);L.nextlist:=S.nextlist L玲SL.nextlist:=S.nextlistfor循環(huán)語(yǔ)句的翻譯for循環(huán)語(yǔ)句的文法如下所示:S玲forid:=E1toE2stepE3doS1for循環(huán)語(yǔ)句的翻譯模式如下所示:S玲forid:=E1toE2stepE3doMS1backpatch(S1.nextlist,M.again,);ge

13、ncode(goto,-, -,M.again);S.nextlist:=M.again;M玲eM.addr:=entry(id);gencode(:=,E10 / 16l.addr, -,M.addr);T1:=newtemp;gencode(:=,E2.addr, -,T1);T2:=newtemp;gencode(:=,E3.addr, -,T2);q:=nextquad;gencode(goto,-, -,q+2);M.again:=q+1;gencode(+,M.addr,T2,M.addr);M.nextlist:=nextquad;gencode(ifM.addrT1goto-)

14、;5.4 repeat語(yǔ)句的翻譯repeat語(yǔ)句的文法如下所示:S玲repeats1untilBRepeat語(yǔ)句的翻譯模式如下所示:S玲repeatM S1untilNBbackpatch(B.falselist,M.quad);S.nextlist:=B.truelistM玲eM.quad:=nextquadN玲ebackpatch(S1.nextlist,nextquad)11 / 166.switch語(yǔ)句的語(yǔ)法制導(dǎo)翻譯switch語(yǔ)句的文法為:S玲switch(E)ClistClist玲caseV:SClist|default:Sswitch語(yǔ)句的翻譯模式如下所示:S玲switch(E)

15、i:=0;S.nextlist:=0; pushS.nextlist; pushE.addr; pushi;q:=0; pushqClistpopq;popi;popE.addr;popSi.nextlist;S.nextlist:=merge(Si.nextlist,q); pushS.nextlist Clist玲caseV:popq; popi;i:=i+1; popE.addr;ifnextquadw0thenbackpatch(q,nextquad);q:=nextquad;gencode(ifE.addrVigotoLi);push E.addr; pushi;push qSpop

16、q; popi; popE.addr; popSi-l.nextlist;p:=nextquad;gencode(goto -);gencode(Li:);12 / 16Si.nextlist:=merge(Si.nextlist,p);Si.nextlist:=merge(Si.nextlist,Si-l.nextlist);push Si.nextlist; pushE.addr; pushi; pushqClist(3)Clist玲default:popq; popi;i:=i+1; popE.addr;ifnextquadw0thenbackpatch(q,nextquad);q:=n

17、extquad;gencode(ifE.addrVigotoVi+1);push E.addr; pushi;push qSpopq; popi; popE.addr; popSi-l.nextlist;p:=nextquad;gencode(goto -);gencode(Li:);13 / 16i.nextlist:=merge(Si.nextlist,p);Si.nextlist:=merge(Si.nextlist,Si-l.nextlist);push S.nextlist; pushE.addr; pushi; pushq.過(guò)程調(diào)用和返回語(yǔ)句的翻譯過(guò)程調(diào)用和返回語(yǔ)句的文法如下所示:

18、S玲callid(Elist)Elist玲Elist,E|ES玲returnE過(guò)程調(diào)用語(yǔ)句的翻譯模式如下所示:S玲callid(Elist) n:=0;repeatn:=n+1;從queue的隊(duì)首取出一個(gè)實(shí)參地址p;gencode(param, -, -,p);untilqueue 為空;14 / 16gencode(call,id.addr,n, -)(2)Elist玲Elist,E E.addr 添加到 queue 的隊(duì)尾(3)Elist玲E初始化queue,然后將E.addr加入到queue的隊(duì)尾。 過(guò)程返回語(yǔ)句的翻譯模式為:S玲returnEif 需要返回結(jié)果 thengencode(:=,E.addr, -,F);gencode(ret,-, -, -)其中,F(xiàn)是存放結(jié)果的指定單元,四元式(ret,-,-,-)執(zhí)行如下操作: 恢復(fù)主調(diào)程序的寄存器內(nèi)容;釋放過(guò)程運(yùn)行時(shí)所占用的數(shù)據(jù)區(qū);按返回地址返回到主調(diào)程序。.輸入輸出語(yǔ)句的翻譯帶I/O參

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論