版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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).記錄的翻譯下面是生成記錄類型的產(chǎn)生式:T玲recordDend生成記錄類型的翻譯模式: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)益歸上傳用戶所有。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人與個(gè)人2024年度旅游服務(wù)合同3篇
- 二零二五版節(jié)能保溫材料采購(gòu)、倉(cāng)儲(chǔ)及配送合同2篇
- 二零二五年度汽車零部件買賣及安裝合同4篇
- 二零二五年房產(chǎn)經(jīng)紀(jì)行業(yè)房產(chǎn)買賣租賃客戶關(guān)系管理體系合同3篇
- 2024鋁扣板吊頂工程節(jié)能評(píng)估與施工合同協(xié)議3篇
- 二零二四小學(xué)門衛(wèi)信息化管理及智能設(shè)備應(yīng)用聘用合同3篇
- 2025年度旅行社培訓(xùn)與咨詢服務(wù)合同4篇
- 二零二五年度知識(shí)產(chǎn)權(quán)定金合同糾紛起訴狀樣本3篇
- 買期房的合同范本
- 二零二五年綠色物流海上貨物運(yùn)輸保險(xiǎn)合同與環(huán)保標(biāo)準(zhǔn)3篇
- 工程管理重大風(fēng)險(xiǎn)應(yīng)對(duì)方案
- 直播帶貨助農(nóng)現(xiàn)狀及發(fā)展對(duì)策研究-以抖音直播為例(開題)
- 腰椎間盤突出疑難病例討論
- 《光伏發(fā)電工程工程量清單計(jì)價(jià)規(guī)范》
- 2023-2024學(xué)年度人教版四年級(jí)語(yǔ)文上冊(cè)寒假作業(yè)
- (完整版)保證藥品信息來(lái)源合法、真實(shí)、安全的管理措施、情況說(shuō)明及相關(guān)證明
- 營(yíng)銷專員績(jī)效考核指標(biāo)
- 陜西麟游風(fēng)電吊裝方案專家論證版
- 供應(yīng)商審核培訓(xùn)教程
- 【盒馬鮮生生鮮類產(chǎn)品配送服務(wù)問題及優(yōu)化建議分析10000字(論文)】
- 肝硬化心衰患者的護(hù)理查房課件
評(píng)論
0/150
提交評(píng)論