版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東外語(yǔ)外貿(mào)大學(xué)《跨境電商理論與實(shí)務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東南華工商職業(yè)學(xué)院《電視攝像技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 【名師一號(hào)】2020-2021學(xué)年高中地湘教版必修1-雙基限時(shí)練15
- 【2021屆備考】2021屆全國(guó)名校生物試題分類(lèi)解析匯編第七期(12月)-G單元生物的變異
- 【2022走向高考】高三英語(yǔ)一輪(外研版)復(fù)習(xí):必修4-Module-6綜合測(cè)試
- 第五章 透鏡及其應(yīng)用 單元測(cè)試(含解析) 2024-2025學(xué)年物理人教版(2024)八年級(jí)上冊(cè)
- 【狀元之路】2021高考物理一輪復(fù)習(xí)課時(shí)作業(yè):12-2-機(jī)械波
- 《肺癌的手術(shù)治療》課件
- 全國(guó)2021屆高三英語(yǔ)試題8、9月分類(lèi)解析:B單元-完形填空(B1-記敘文)
- 【走向高考】2021屆高考?xì)v史(人民版)一輪復(fù)習(xí)階段性測(cè)試題十二(必修三-專(zhuān)題六、七-專(zhuān)題測(cè)試)
- (八省聯(lián)考)河南省2025年高考綜合改革適應(yīng)性演練 生物試卷(含答案)
- 人工智能銷(xiāo)售工作總結(jié)
- 2025年中小學(xué)春節(jié)安全教育主題班會(huì)課件
- 工商注冊(cè)租房合同范例
- 2024年單位司機(jī)個(gè)人工作總結(jié)(6篇)
- 2023-2024學(xué)年廣東省深圳市羅湖區(qū)八年級(jí)上學(xué)期期末生物試題
- 【9物(北師)期末】阜陽(yáng)市臨泉縣2023-2024學(xué)年九年級(jí)上學(xué)期期末考試物理試題
- 2025年醫(yī)院保衛(wèi)科工作總結(jié)及2025年工作計(jì)劃
- 班會(huì)課件高中
- 部編版一年級(jí)上冊(cè)語(yǔ)文第一單元-作業(yè)設(shè)計(jì)
- 醫(yī)院消防安全知識(shí)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論