• 1.03 MB
  • 2022-04-29 14:21:33 发布

最新声明语句的翻译教学课件PPT课件

  • 36页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'声明语句的翻译教学课件 4.4声明语句的翻译作用域信息的保存过程的作用域与程序块类似,在允许嵌套定义过程的程序设计语言中,相同的名字可以同时出现在不同的作用域中,因此有必要讨论如何设计符号表来存放它们。此处讨论的过程作用域,同样遵守静态作用域和最近嵌套原则。2 4.4声明语句的翻译全程量、属性与语义函数全程量:有序对栈(tblptr,offset)(符号表节点的指针,符号表节点所需宽度)栈上的操作:push(t,o)、pop、top(stack)语义函数与过程:函数mktable(previous):建立一个新的符号表,返回指向符号表的指针。previous是逆向链,指向前一符号表(外层)。过程enter(table,name,type,offset):在table指向的节点中为名字name建立新的条目,包括名字的类型和存储位置等。过程addwidth(table,width):计算table节点中所有条目的累加宽度,并记录在table的头部信息中。过程enterproc(table,name,newtable):为过程name在table指向的节点中建立一个新的条目。参数newtable是正向链,指向name过程自身的符号表节点。9 4.4声明语句的翻译语义规则(1)P→MD{addwidth(top(tblptr),top(offset));pop;}(2)M→ε{t:=mktable(null);push(t,0,);}(3)D→D;D(4)D→id:T{enter(top(tblptr),id.name,T.type,top(offset));top(offset):=top(offset)+T.width;}(5)D→procid;ND1;S{t:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),id.name,t);}(6)N→ε{t:=mktable(top(tblptr));push(t,0);}10 4.4声明语句的翻译语法制导翻译的过程procsort;a:array[10]ofint;x:int;procreadarry;i:int;read(a);readarrayP→MD(1)D→D;D(2)|id:T(3)|procid;ND;S(4)M→ε(5)N→ε(6)t1t2t311 (1)M1→εt1:=mktable(null);push(t1,0);nullt10t112 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);nullt10t20t1t1t213 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4nullt10t20t1t1t214 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40nullt10t20t1t1t215 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2,top(offset):=40nullt10t20aarr,0t1t1t2t24016 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4nullt10t240aarr,0t1t1t217 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44nullt10t240aarr,0xInt,40t1t1t2t24418 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);nullt10t244t1t2t3t30aarr,0xInt,40t1t219 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4nullt10t244t1t2t3t30aarr,0xInt,40t1t220 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4D3→i:T4(i,int,0)填进t3所指节点,top(offset):=4nullt10t244aarr,0xInt,40t1t1t2iint,0t2t3t34t3021 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4D3→i:T4(i,int,0)填进t3所指节点,top(offset):=4(11)D4→procreadarrayN2D3;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),readarray,t);nullt10t244aarr,0xInt,40t1t1t24iint,0t2t3t3422 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4D3→i:T4(i,int,0)填进t3所指节点,top(offset):=4(11)D4→procreadarrayN2D3;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),readarray,t);nullt10t244aarr,0xInt,40t1t1t24iint,0t2t323 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4D3→i:T4(i,int,0)填进t3所指节点,top(offset):=4(11)D4→procreadarrayN2D3;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),readarray,t);nullt10t244aarr,0xInt,40readarrayt3t1t1t24iint,0t2t324 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4D3→i:T4(i,int,0)填进t3所指节点,top(offset):=4(11)D4→procreadarrayN2D3;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),readarray,t);(14)D7→procsortN1D6;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),sort,t);nullt10t24444aarr,0xInt,40readarrayt3t1t1t24iint,0t2t325 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4D3→i:T4(i,int,0)填进t3所指节点,top(offset):=4(11)D4→procreadarrayN2D3;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),readarray,t);(14)D7→procsortN1D6;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),sort,t);nullt1044aarr,0xInt,40readarrayt3t1t1t24iint,0t2t326 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4D3→i:T4(i,int,0)填进t3所指节点,top(offset):=4(11)D4→procreadarrayN2D3;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),readarray,t);(14)D7→procsortN1D6;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),sort,t);sortt2nullt10t14iint,0t2t344aarr,0xInt,40readarrayt3t1t227 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4D3→i:T4(i,int,0)填进t3所指节点,top(offset):=4(11)D4→procreadarrayN2D3;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),readarray,t);(14)D7→procsortN1D6;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),sort,t);(15)P→M1D7addwidth(top(tblptr),top(offset));pop;0sortt2nullt10t14iint,0t2t344aarr,0xInt,40readarrayt3t1t228 M1→εt1:=mktable(null);push(t1,0);N1→εt2:=mktable(top(tblptr));push(t2,0);T1→intT1.type=integer,T1.width=4T2→array[10]ofT1T2.type=array(10,int),T2.width=40D1→a:T2(a,arr,0)填进t2所指节点,top(offset):=40T3→intT2.type=integer,T2.width=4D2→x:T3(x,int,40)填进t2所指节点,top(offset):=44N2→εt3:=mktable(top(tblptr));push(t3,0);T4→intT4.type=integer,T4.width=4D3→i:T4(i,int,0)填进t3所指节点,top(offset):=4(11)D4→procreadarrayN2D3;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),readarray,t);(14)D7→procsortN1D6;St:=top(tblptr);addwidth(t,top(offset));pop;enterproc(top(tblptr),sort,t);(15)P→M1D7addwidth(top(tblptr),top(offset));pop;0sortt2nullt14iint,0t2t344aarr,0xInt,40readarrayt3t1t229 4.5简单算术表达式与赋值句讨论所基于的文法:A→id:=EE→E+E|E*E|-E|(E)|id简单变量的语法制导翻译属性.place:存放E的变量名地址(符号表中地址或临时变量)过程emit():生成result:=arg1oparg2的三地址码。(1)A→id:=E{emit(entry(id.name)":="E.place)}(2)E→E1+E2{E.place:=newtemp;emit(E.place":="E1.place"+"E2.place)}(3)E→E1*E2{E.place:=newtemp;emit(E.place":="E1.place"*"E2.place)}(4)E→-E1{E.place:=newtemp;emit(E.place":=""-"E1.place)}(5)E→(E1){E.place:=E1.place}(6)E→id{E.place:=entry(id.name)}30 4.5简单算术表达式与赋值句变量的(内部)类型转换强制(coercion):按照一定的原则,将不同类型的变量在内部转换为相同的类型,然后进行同类型变量的计算。属性.mode:取值int或real表达式EE1opE2的类型判定树:运算的转换原则赋值的转换原则31 4.5简单算术表达式与赋值句三地址码:T:=itrE:将E从整型变为实型,结果存放T中T:=rtiE:将E从实型变为整型,结果存放T中语义规则(加入类型转换之后):A→id:=E{tmode:=entry(id.name).mode;iftmode=E.modethenemit(entry(id.name)":="E.place);elseT:=newtemp;iftmode=intthenemit(T":="rtiE.place);elseemit(T":="itrE.place);endif;emit(entry(id.name)":="T);endif;}32 4.5简单算术表达式与赋值句E→E1opE2{T:=newtemp;E.mode:=real;ifE1.mode=intthenifE2.mode=intthenemit(T":="E1.placeOPiE2.place);E.mode:=int;elseU:=newtemp;emit(U":="itrE1.place);emit(T":="UOPrE2.place);endif;elseifE2.mode=intthenU:=newtemp;emit(U":="itrE2.place);emit(T":="E1.placeOPrU);elseemit(T":="E1.placeOPrE2.place);endif;endif;E.place:=T;}其他语义规则看教材19733 4.5简单算术表达式与赋值句[例4.17]x:=-a*b+c的语法制导翻译,x、a、b是整型数,c是实型数。序号产生式中间代码(1)E1→a(2)E2→-E1t1:=-a(3)E3→b(4)E4→E2*E3t2:=t1*ib(5)E5→c(6)E6→E4+E5t4:=itrt2t3:=t4+rc(7)A→x:=E6t5:=rtit3x:=t5.int.int.int.real.int(itor).real(rtoi)34 P241:4.5,4.735 '