资源描述:
《第7章 语义分析与中间代码生成.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、7语义分析与中间代码生成内容提要中间语言声明语句的语义处理表达式及赋值语句的翻译控制语句的翻译过程或函数调用语句的翻译7.1几种常见的中间语言图表示法语法树:分析树的压缩形式,去掉了分析树中与语义无关紧要的成分。有向无环图(DirectedAcyclicGraph,DAG):把表达式的公共子表达式看成是等同的,所有公共子表达式共享一个结点。例如,赋值语句a=b*−c+b*−c的语法树和DAG=a+*bcuminus(a)语法树*uminuscb=a+*bcuminus(b)DAG产生式语义规则Sid=
2、EEE(1)+E(2)EE(1)*E(2)E−E(1)E(E(1))EidS.nptr:=mknode('=',mkleaf(id,id.place),E.nptr)E.nptr:=mknode('+',E(1).nptr,E(2).nptr)E.nptr:=mknode('*',E(1).nptr,E(2).nptr)E.nptr:=mkunode('uminus',E(1).nptr)E.nptr:=E(1).nptrE.nptr:=mkleaf(id,id.place)产生赋值语句语法树
3、的语法制导定义三地址代码1.三地址代码的形式三地址代码语句的一般形式为x=yopz其中,x、y和z为(变量的)名字、常量或编译时产生的临时变量;op为运算符。三地址代码的每条语句通常包含三个地址,两个用来存放运算对象,一个用来存放运算结果。由于三地址语句的右边只含有一个运算符,因此多个运算符组成的表达式必须用三地址语句序列来表示,如表达式x+y*z的三地址代码为:t1=y*zt2=x+t1其中,t1和t2是编译时产生的临时变量。2.三地址语句的种类三地址语句非常类似于汇编代码,它可以有符号标号和各种控制
4、流语句。常用的三地址语句:(1)x=yopz形式的赋值语句,其中op为二目的算术运算符或逻辑运算符。(2)x=opy形式的赋值语句,其中op为一目运算符,如一目减uminus、逻辑否定not、移位运算符以及类型转换符。(3)x=y形式的复制语句,将y的值赋给x。(4)无条件转移语句gotoL,即下一个将被执行的语句是标号为L的语句。(5)条件转移语句ifxropygotoL,其中rop为关系运算符,如<、<=、==、!=、>、>=等。若x和y满足关系rop就转去执行标号为L的语句,否则继续按顺序执行本语
5、句的下一条语句。(6)过程调用语句parx和callp,n。源程序中的过程调用语句p(x1,x2,…,xn)可用下列三地址代码表示:parx1parx2parxncallp,n其中,整数n为实参个数。过程返回语句为returny,其中y为返回值,可选。(7)变址赋值语句x=y[i],表示把从地址y开始的第i个地址单元中的值赋给x。x[i]=y则表示把y的值赋给从地址x开始的第i个地址单元。(8)地址和指针赋值语句①x=&y表示将y的地址赋给x,y可以是一个名字或一个临时变量,而x是一个指针;②x=*y
6、表示将y所指示的地址单元中的内容赋给x,y是一个指针;③*x=y表示将x所指对象的值置为y的值。3.三地址代码的实现三地址代码是中间代码的一种抽象形式。在编译程序中,可以以带有操作符和操作数域的结构体来实现。1)四元式四元式是具有四个域的结构体,形如(op,arg1,arg2,result)其中,op为运算符;arg1、arg2及result为指向有关名字在符号表中的登记项或一临时变量的指针,也可空缺。常用的三地址语句与相应的四元式:x=yopz对应(op,y,z,x)x=−y对应(uminus,y,_
7、,x)x=y对应(=,y,_,x)parx1对应(par,x1,_,_)callP对应(call,_,_,P)gotoL对应(j,_,_,L)ifxropygotoL对应(jrop,x,y,L)例如,赋值语句a=b*(c+d)的四元式代码:①(+,c,d,t1)②(*,b,t1,t2)③(=,t2,_,a)约定:一元运算符一律使用arg1。此外,如果op是一个算术或逻辑运算符,则result总是一个新引进的临时变量,它用来存放运算结果。结论:四元式出现的顺序与表达式计值的顺序是一致的,四元式之间的联系是
8、通过临时变量实现的。四元式由于其表示更接近程序设计的习惯而成为一种普遍采用的中间代码形式。2)三元式三元式具有三个域,形如(op,arg1,arg2)。其中,op为运算符;arg1、arg2既可指向符号表中的表项或临时变量,也可指向某个三元式。例如,赋值语句a=(b+c)*(b+c)的三元式代码:①(+,b,c)②(+,b,c)③(*,①,②)④(=,a,③)结论:三元式出现的先后顺序和表达式各部分的计值顺序是一致的。三元式通过三元式编号引