
8.4简单赋值语句的翻译p179 ■语法1d:=E ■语义计算表达式E的值之后把值赋给变量id ■文法G[S]: S→id:=E E→E1+E2 E→E1*E2 E→-E1 E→(E) E→id 2025/4/3 章节目录可)1
2025/4/3 1 8.4 简单赋值语句的翻译 p179 语法 id := E 语义 计算表达式E的值之后把值赋给变量id 文法G[S]: S→id:=E E→E1+E2 E→E1*E2 E→-E1 E→(E1) E→id 章节目录

语义过程及属性设置p178 ■语义过程 ◆lookup(id.name)检查在符号表中是否存在 id.name的表项。 ookup(id.name)=d,entry1d.name在表y nil 否则 ◆emit(x‘:=’y‘+’z)将生成的三地址代码 x:=y+z发送到输出文件。 ◆newtemp每调用一次,生成一个临时变量。 ■属性设置 ◆存储位置place。例如E.place,T.place等 2025/413 ☒2
2025/4/3 2 语义过程及属性设置p178 语义过程 lookup(id.name)检查在符号表中是否存在 id.name的表项。 emit(x‘:=’y‘+’z) 将生成的三地址代码 x:=y+z发送到输出文件。 newtemp 每调用一次,生成一个临时变量。 属性设置 存储位置 place。例如E.place,T.place等 lookup(id.name)= id.entry id.name在表中 nil 否则

产生赋值语句三地址代码的翻译模式p180 S→id:=E{ p:=lookup (id.name); (sub1) ifp<>nil then emit(p:=,E.place)/*id在表中*/ else error/*id不在表中*/} E→E1+E2 E.place=newtemp; (sub2) emit (E.place':='E1.place'+'E2.place')} E→E1*E2 E.place=newtemp; (sub3) emit (E.place':='E1.place'*'E2.place')} E→-E1 E.place:=newtemp; (sub4) emit(E.place:=''uminus'E1.place} E→(E1) E.place:=E1.place} (sub5) E→id p:=lookup(id.name); (sub6) ifp<>nil then E.place:=p/*id在表中*/ else error/*id不在表中*/} 2025/4/3 ☑D3
2025/4/3 3 产生赋值语句三地址代码的翻译模式 p180 S→id:=E { p:=lookup(id.name); (sub1) if p<>nil then emit(p‘:=’ E.place) /*id在表中*/ else error /*id不在表中*/ } E→E1+E2 { E.place=newtemp; (sub2) emit(E.place':='E1.place'+'E2.place')} E→E1*E2 { E.place=newtemp; (sub3) emit(E.place':='E1.place'*'E2.place')} E→-E1 { E.place:=newtemp; (sub4) emit(E.place ´ := ´ ´uminus´E1.place} E→(E1) { E.place:=E1.place} (sub5) E→id { p:=lookup(id.name); (sub6) if p<>nil then E.place:=p /*id在表中*/ else error/*id不在表中*/ }

a:=-c+b*d自下而上语法制导翻译过程举例 步骤符号栈输入串动作语义值三地址代码 0#a:=-c+b*d#预备 1#1:=-c+b*d#移进 a 2#1:=-c+b*d#移进 a 3#1:=-c+b*d#移进 a 4#i:=-1 +b*d#移进 a_c 5#1:=E +b*d#归sub6a c 6#1:=E+b*d#归sub4aT1 Tl:=-c E父E米E 7#1:旰 b*d#移进 a TI 8#i:=E+1 米d#移进 a T1 b 9#1:=+E *d#归sub6aTI5 10#1:=计E* d#移进 a Tl b 0 11#i:=E+E*1 #移进 a Tl b d 12 #i:=E+E*E #归sub6aT1bd 另见: 13#i:=E+E #归sub3 a T1 T2 T2:=b*d 教材p174 图8.7 14#1:=E #归sub2aT3 T3:=T1+T2 15$ #归sub1 a:=T3 16 分析成功结束 2025/4/3 ✉)4
2025/4/3 4 a:= -c+b*d自下而上语法制导翻译过程举例 步骤 符号栈 输入串 动作 语义值 三地址代码 0 # a:=-c+b*d# 预备 i := E a S E + E - E i c E * E i b i d 1 #i :=-c+b*d# 移进 a 2 #i:= -c+b*d# 移进 a_ 3 #i:=- c+b*d# 移进 a_ _ 4 #i:=-i +b*d# 移进 a_ _c 5 #i:=-E +b*d# 归sub6 a_ _c 6 #i:=E +b*d# 归sub4 a_T1 T1:=-c 7 #i:=E+ b*d# 移进 a_T1_ 8 #i:=E+i *d# 移进 a_T1_b 9 #i:=E+E *d# 归sub6 a_T1_b 10 #i:=E+E* d# 移进 a_T1_b_ 11 #i:=E+E*i # 移进 a_T1_b_d 12 #i:=E+E*E # 归sub6 a_T1_b_d 13 #i:=E+E # 归sub3 a_T1_T2 T2:=b*d 14 #i:=E # 归sub2 a_T3 T3:=T1+T2 15 #S # 归sub1 a:=T3 16 分析成功结束 另见: 教材p174 图8.7

8.5布尔表达式的翻译p181 布尔表达式作用 ■布尔表达式文法 ■布尔表达式翻译方法 ◆数值表示法 ◆作为控制条件的布尔表达式翻译 2025/413 章节目录可D5
2025/4/3 5 8.5 布尔表达式的翻译 p181 章节目录 布尔表达式作用 布尔表达式文法 布尔表达式翻译方法 数值表示法 作为控制条件的布尔表达式翻译

布尔表达式的作用p181 ■布尔表达式的作用 ◆计算逻辑值 ◆控制流语句如if-then,if-then-else和while-do 等之中的条件表达式 ■例如 ◆1or(not0and0)or0 ◆a<borc<d and e<f if a<b or c<d and e<f then x:=1 else x:=-1 ◆while a<bdoa:=a-b 2025/4/3 节目录 ☒D☑6
2025/4/3 6 布尔表达式的作用 p181 布尔表达式的作用 计算逻辑值 控制流语句如if-then,if-then-else和while-do 等之中的条件表达式 例如 1 or ( not 0 and 0 ) or 0 a<b or c<d and e<f if a<b or c<d and e<f then x:=1 else x:=-1 while a<b do a:=a-b 节目录

布尔表达式的文法p181 ■布尔表达式-一用布尔运算符号(and,or,not) 作用到布尔变量或关系表达式上而组成 ◆例如布尔表达式:a or b and c〈d ■考虑如下生成布尔表达式的文法 ◆E→EorE|E and Enot E|(E)|id relop id id 其中relop:表示六个关系运算符之一 例如E=>EorE ==>E or E and E ==>E or E and id relop id 对应语法树 ==>E or id and id relop id ==>id or id and id relop id a b d 2025/4/3 节目录☑回7
2025/4/3 7 布尔表达式的文法 p181 布尔表达式——用布尔运算符号(and,or,not) 作用到布尔变量或关系表达式上而组成 例如 布尔表达式: a or b and c E or E a b c E or E and E ==>E or E and id relop id ==>E or id and id relop id ==>id or id and id relop id 节目录

数值表示法p182 若用1表示真,0表示假,则布尔表达式可以象算术 表达式一样来计算 ■例如逻辑表达式 ■例如关系表达式a 后续代码 2025/4/13 ☒☑8
2025/4/3 8 数值表示法 p182 若用1表示真,0表示假,则布尔表达式可以象算术 表达式一样来计算 例如 关系表达式 a<b 可等价地写成: if a<b then 1 else 0 翻译成三地址代码: 100 if a<b goto 103 101 T1:=0 102 goto 104 103 T1:=1 104 例如 逻辑表达式 a or b and not c 翻译成三地址代码: (1)T1:=not c (2)T2:=b and T1 (3)T3:=a or T2 nextstat+3 a<b为假 nextstat+2 a<b为真 后续代码 nextstat

布尔式数值计算翻译模式中 有关属性和函数p182 ■属性 ◆E.place综合属性,表示存放布尔表达式值的 名字 ◆relop.op综合属性,表示六个关系运算符之一 ■三地址代码的编号 ◆nextstat给出输出三地址代码序列中下一条代 码的编号(地址索引) ■函数 ◆emit将产生的三地址代码送到输出文件中,每 产生一条三地址代码后,emit便把nextstat:增1 2025/4/3
2025/4/3 9 布尔式数值计算翻译模式中 有关属性和函数 p182 属性 E.place 综合属性,表示存放布尔表达式值的 名字 relop.op 综合属性,表示六个关系运算符之一 三地址代码的编号 nextstat 给出输出三地址代码序列中下一条代 码的编号(地址索引) 函数 emit 将产生的三地址代码送到输出文件中,每 产生一条三地址代码后,emit便把nextstat增1

计算布尔表达式值三地址代码的翻译模式p182 E→E1orE2 [E.place:=newtemp; subl emit(E.place‘:=’E1.place‘or’E2.place)} E→E1andE2 [E.place:=newtemp; sub2 emit(E.place‘:=’E1.place‘and'E2.place)} E→notE1 {E.place newtemp; sub3 emit(E.place‘:=’‘not’El.place))} E→(E1) E.place:=E1.place)} sub4 E→id1 [E.place:=newtemp; relop id2 emit(‘if’idl.place relop.opid2.place sub5 ‘goto'nextstat-+3); emit(E.place‘:=’‘0'); emit 'goto'nextstat+2); emit(E.place‘:=’‘1’)} E→id {E.place:=id.place(与教材不同) sub6 2025/4/3 ☒D1o
2025/4/3 10 计算布尔表达式值三地址代码的翻译模式 p182 E→E1 or E2 {E.place:=newtemp; sub1 emit(E.place‘:=’E1.place‘or’E2.place)} E→E1 and E2 {E.place:=newtemp; sub2 emit(E.place‘:=’E1.place‘and’E2.place)} E→not E1 {E.place = newtemp; sub3 emit(E.place‘:=’‘not’E1.place)} E→(E1) {E.place:=E1.place)} sub4 E→id1 {E.place:=newtemp; relop id2 emit(‘if’id1.place relop.op id2.place sub5 ‘goto’nextstat+3); emit(E.place‘:=’‘0’); emit(‘goto’nextstat+2); emit(E.place‘:=’‘1’)} E→id {E.place:=id.place } (与教材不同) sub6