各种语言成分的语法及其翻译方案示_第1页
各种语言成分的语法及其翻译方案示_第2页
各种语言成分的语法及其翻译方案示_第3页
各种语言成分的语法及其翻译方案示_第4页
各种语言成分的语法及其翻译方案示_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、各种语言成分的语法及其翻译方案(示例)1.普通声明语句的翻译下面是声明语句的文法:P玲progid(input,output)D;SD玲D;D|List :T|procidD;SList玲List1,id|idT玲integer|real|arrayC of T1| T1|recordDC numC|e声明语句的翻译模式: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玲个T1 / 161T.type:=pointer(T.type);T.width:= 4.嵌套过程中声明语句的翻译嵌套过程声明语句的产生式。P玲progid(input,output)D;SD玲D;D|id :T|proc id ;D;S(7.1)嵌套过程声明语句的翻译模式: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).记录的翻译下面是生成记录类型的产生式: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).赋值语句的翻译下面是典型的赋值语句文法:S玲Left:=EE玲E1+E2|E1*E2| -E1| (E) |LeftLeft玲Elist |idElist玲Elist,E|idE(7.2)赋值

5、语句的翻译模式:S玲Left:=EifLeft.offset=nullthen/*Left 是简单变量 id*/gencode(Left.addr :=E.addr);elsegencode(Left.addr Left.offset :=E.addr) /*Left 是数组元素*/EE1+E3 / 162E.addr:=newtemp;gencode(E.addr :=El.addr+E.addr)(3)E玲(E1)E.addr:=E.addrE玲LeftifLeft.offset=nullthen/*Left 是简单 id*/E.addr:=Left.addrelsebegin /*Lef

6、t 是数组元素*/E.addr:=newtemp;gencode(E.addr :=Left.addr Left.offset )endLeft玲ElistLeft.addr:=newtemp;/*Left是数组元素,因此存放基址和位移 */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); /*计算 e m-1xnm*/gencode(t :=t +E.addr);/* 计算+im*/Elist.array:=Elistl.array;Elist.addr:=t;Elist.ndim:=m ElistidE Elist.array:=id.addr;Elist.addr:=E.addr;Elist.ndim:=1.各种控制结构的翻译布尔表达式的翻译布尔表达式的文法为:BOB1orMB 2 BOB1andMB2(3)BOnotB1 BO(B)5

8、/ 16BOEIrelopEB玲trueB玲falseM玲e布尔表达式的翻译模式如下所示: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常用控制流语句的翻译控制流语句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 语句的翻译模式: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循环语句的翻译for循环语句的文法如下所示:S玲forid:=E1toE2stepE3doS1for循环语句的翻译模式如下所示: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语句的翻译repeat语句的文法如下所示:S玲repeats1untilBRepeat语句的翻译模式如下所示:S玲repeatM S1untilNBbackpatch(B.falselist,M.quad);S.nextlist:=B.truelistM玲eM.quad:=nextquadN玲ebackpatch(S1.nextlist,nextquad)11 / 166.switch语句的语法制导翻译switch语句的文法为:S玲switch(E)ClistClist玲caseV:SClist|default:Sswitch语句的翻译模式如下所示: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.过程调用和返回语句的翻译过程调用和返回语句的文法如下所示:

18、S玲callid(Elist)Elist玲Elist,E|ES玲returnE过程调用语句的翻译模式如下所示:S玲callid(Elist) n:=0;repeatn:=n+1;从queue的队首取出一个实参地址p;gencode(param, -, -,p);untilqueue 为空;14 / 16gencode(call,id.addr,n, -)(2)Elist玲Elist,E E.addr 添加到 queue 的队尾(3)Elist玲E初始化queue,然后将E.addr加入到queue的队尾。 过程返回语句的翻译模式为:S玲returnEif 需要返回结果 thengencode(:=,E.addr, -,F);gencode(ret,-, -, -)其中,F是存放结果的指定单元,四元式(ret,-,-,-)执行如下操作: 恢复主调程序的寄存器内容;释放过程运行时所占用的数据区;按返回地址返回到主调程序。.输入输出语句的翻译带I/O参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论