T:=-c T1:=-C T2:=b*T1 T2:=b*T1 T3=-C T5=T2+T2 Ta:=b*T3 a:=T5 Tg:=T2+T4 a:-T5 对于抽象语法树的代码 对于DAG的代码 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 T1 :=-c T1 :=-c T2 :=b*T1 T2 :=b*T1 T3 :=-c T5 :=T2+T2 T4 :=b*T3 a:=T5 T5 :=T2+T4 a:=T5 对于抽象语法树的代码 对于DAG的代码
三地址语句的种类 ■X:=yopZ ■) x:=op y ■X:y goto L ■ ■if x relop y goto Li或if a goto L ■ param x和call p,n,以及返回语句return y ■ x:=y[叮及x叮:y的索引赋值 X:=&y,X:=*y和*x:y的地址和指针赋值 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 三地址语句的种类 ◼ 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 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 ◼ 生成三地址代码时,临时变量的名字对应 抽象语法树的内部结点 ◼ id:=E 对表达式E求值并置于变量T中值 id.place:=T
从赋值语句生成三地址代码的S-属性文法 ■非终结符号S有综合属性S.code,它代表 赋值语句S的三地址代码。 ■非终结符号E有如下两个属性: 口E.place表示存放E值的名字。 口E.code表示对E求值的三地址语句序列。 口函数newtemp的功能是,每次调用它时,将返 回一个不同临时变量名字,如T1,T2,。 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 从赋值语句生成三地址代码的S-属性文法 ◼ 非终结符号S有综合属性S.code,它代表 赋值语句S的三地址代码。 ◼ 非终结符号E有如下两个属性: E.place表示存放E值的名字。 E.code表示对E求值的三地址语句序列。 函数newtemp的功能是,每次调用它时,将返 回一个不同临时变量名字,如T1 ,T2 ,…
为赋值语句生成三地址代码的S-属性文法定义 产生式 语义规则 S-id:=E S.code:=E.code l gen(id.place :='E.place) E→E1+E2 E.place:=newtemp; E.code:=E.code l E2.code gen(E.place':='E.place +E2.place) E→E*E2 E.place:=newtemp; E.code:=E.code l E2.codell gen(E.place :=E.place 4*E2.place) E→-E1 E.place:=newtemp; E.code=E1,code川 gen(E.place :=uminus'E.place) E→(E) E.place:=E.place; E.code:=E.code Eid E.place:=id.place; E.code=
国防科技大学计算机系602教研室 为赋值语句生成三地址代码的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=‘ ’