文档详情

编译7语义分析及中间代码产生2(zss) - 副本.ppt

发布:2017-06-01约6.32千字共33页下载文档
文本预览下载声明
编译原理(第三版) 陈火旺等编著 (2012年9月-12月) 主讲:朱世松 计算机学院 三地址语句的种类 x:=y op z x:=op y x:=y goto L if x relop y goto L或if a goto L param x和call p,n,以及返回语句return y x:=y[i]及x[i]:=y的索引赋值 x:=y, x:=*y和*x:=y的地址和指针赋值 生成三地址代码时,临时变量的名字对应抽象语法树的内部结点 id:=E 对表达式E求值并置于变量T中值 id.place:=T 从赋值语句生成三地址代码的S-属性文法 非终结符号S有综合属性S.code,它代表赋值语句S的三地址代码。 非终结符号E有如下两个属性: E.place表示存放E值的名字。 E.code表示对E求值的三地址语句序列。 函数newtemp的功能是,每次调用它时,将返回一个不同临时变量名字,如T1,T2,…。 为赋值语句生成三地址代码的S-属性文法定义 产生式 语义规则 S→id:=E S.code:=E.code || gen(id.place ‘:=’ E.place) E→E1+E2 E.place:=newtemp; E.code:=E1.code || E2.code || gen(E.place ‘:=’ E1.place ‘+’ E2.place) E→E1*E2 E.place:=newtemp; E.code:=E1.code || E2.code || gen(E.place ‘:=’ E1.place ‘*’ E2.place) E→-E1 E.place:=newtemp; E.code:=E1.code || gen(E.place ‘:=’ ‘uminus’ E1.place) E→ (E1) E.place:=E1.place; E.code:=E1.code E→id E.place:=id.place; E.code=‘ ’ 三地址语句 四元式 一个带有四个域的记录结构,这四个域分别称为op, arg1, arg2及result op arg1 arg2 result (0) uminus c T1 (1) * b T1 T2 (2) uminus c T3 (3) * b T3 T4 (4) + T2 T4 T5 (5) := T5 a 三地址语句 三元式 通过计算临时变量值的语句的位置来引用这个临时变量 三个域:op、arg1和arg2 op arg1 arg2 (0) uminus c (1) * b (0) (2) uminus c (3) * b (2) (4) + (1) (3) (5) assign a (4) 三地址语句 x[i]:=y op arg1 arg2 (0) [ ] = x i (1) y x:=y[i] op arg1 arg2 (0) = [ ] y i (1) assign x (0) 三地址语句 间接三元式 为了便于优化,用 三元式表+间接码表 表示中间代码 间接码表:一张指示器表,按运算的先后次序列出有关三元式在三元式表中的位置。 优点: 方便优化,节省空间 例如,语句 X:=(A+B)*C; Y:=D↑(A+B) 的间接三元式表示如下表所示。 例:a=A+(-B)*C 的三元式: (1)(@,B,-) (2)(*,(1),C) (3)(+,A,(2)) 7.2 说明语句 略 7.3 赋值语句的翻译 7.3.1 简单算术表达式及赋值语句 为赋值语句生成三地址代码的S-属性文法定义 产生式 语义规则 S→id:=E S.code:=E.code || gen(id.place ‘:=’ E.place) E→E1+E2 E.place:=newtemp; E.code:=E1.code || E2.code || gen(E.place ‘:=’ E1.place ‘+’ E2.place) E→E1*E2 E.place:=newtemp; E.code:=E1.code ||
显示全部
相似文档