7.2说明语句 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 7.2 说明语句
7.3赋值语句的翻译 ■7.3.1简单算术表达式及赋值语句 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 7.3 赋值语句的翻译 ◼ 7.3.1 简单算术表达式及赋值语句
为赋值语句生成三地址代码的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→E1*E2 E.place:=newtemp; E.code:=E.code ll E2.code ll gen(E.place :=E.place4*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=‘ ’
S-id:=E S.code:=E.codell gen(id.place':='E.place) EE+E2 E.place:=newtemp; E.code:=Ecodell E2.code llgen(E.place':='E.place+'E2.place) EE*E2 E.place:=newtemp; E.code:=E-codell E2.codell gen(E.place':='E1place *E2.place 产生赋值语句三地址代码的翻译模式 S→id:=E{p=lookup(id.name); ifp≠nil then emit(p‘:='E.place) else error EE+E2 E.place:=newtemp; emit(E.place :=E.place +'E2.place)) EE*E2 E.place:=newtemp; emit(E.place :='E1place 4*E2.place)} 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 产生赋值语句三地址代码的翻译模式 S→id:=E { p:=lookup(id.name); if pnil then emit(p ‘:=’ E.place) else error } E→E1+E2 { E.place:=newtemp; emit(E.place ‘:=’ E1 .place ‘+’ E2 .place)} E→E1 *E2 { E.place:=newtemp; emit(E.place ‘:=’ E1 .place ‘*’ E 2 .place)} 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.codell gen(E.place':=''uminus'E1.place) E→(E E.place:=E.place; E.code:=E.code E→id E.place:=id.place; E.code= 产生赋值语句三地址代码的翻译模式 E→-E1 E.place:=newtemp; emit(E.place:=''uminus'E 1place)) E→(E) E.place:=E.place} E→id p:=lookup(id.name); ifp≠nil then E.place:=p else error 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 产生赋值语句三地址代码的翻译模式 E→-E1 { E.place:=newtemp; emit(E.place‘:=’ ‘uminus’E 1 .place)} E→(E1 ) { E.place:=E1 .place} E→id { p:=lookup(id.name); if pnil then E.place:=p else error } 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=‘ ’