第八章中间代码生成2015 (1)
第08章 语法制导翻译和中间代码生成

第08章语法制导翻译和中间代码生成《编译原理》课后习题答案第八章第 8 章语法制导翻译和中间代码生成第 1 题给出下面表达式的逆波兰表示(后缀式): (1)a*(-b+c)(2) if(x+y)*z=0 then s∶=(a+b)*c else s∶=a*b*c 答案:给出下面表达式的逆波兰表示(后缀式): (1) ab-c+*(2)xy+z*0=sab+c*:=sab*c*:=¥(注:¥表示 if-then-else 运算)如果写成这样: xy+z*0=sab+c*:=sabc**:=¥,则是错误的,因为写表达式和赋值语句的中间代码序列,或是写它们的代码生成过程,必须注意按照算符优先序进行,这实际上是按照 LR 分析过程进行的。
例如:写出赋值语句 a:=a+b*c*(d+e)的四元式中间代码,当前四元式序号为 100。
不能写成:100 (+,d,e,t1) 101 (*,b,c,t2) 102 (*,t2,t1,t3) 103 (+,a,t3,t4) 104(:=,t4,-,a) 应该写成:100 101 102 103 104(*,b,c,t1) (+,d,e,t2) (*,t1,t2,t3) (+,a,t3,t4) (:=,t4,-,a)第 2 题请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式、四元式序列、树形、逆波兰,当前序号为 100。
答案:三元式: 100 (+, a, b)101 (+, c, d) 102 (* , (1), (2))盛威网()专业的计算机学习网站 1《编译原理》课后习题答案第八章103 104 105 106 (-, (3), /) (+, a, b) (+,(5),c) (- (4), (6))间接三元式:间接三元式序列 100 (+,a, b) 101 102 103 104 105(+,c, d) (*,(1), (2)) (-,(3), /) (+,(1), c) (-,(4), (1))间接码表 (100) (101) (102) (103) (100) (104) (105)或者:间接三元式:100 (+,a, b) 101 (+,c, d) 102 (*,(1), (2)) 103 (-,(3), /) 104 (+,(1), c) 105 (-,(4), (1))间接码表:100 101 102 103 100 104 105四元式:100 (+, a, b, t1) 101 (+, c, d, t2) 102 (*, t1, t2, t3) 103 (-, t3, /, t4) 104 (+, a, b, t5) 105 (+, t5, c, t6) 106 (-, t4, t6, t7) 树形:盛威网()专业的计算机学习网站 2《编译原理》课后习题答案第八章逆波兰:ab+cd+*-ab+c+-[典型例题]:写出 if A and B and C > D thenif Aelse G:=G+1; 的四元式序列, 翻译过程中, 采用 then 与 else 的最近匹配原则。
第8章+语义分析和中间代码生成

的二维数组,一结点一行,行号表示结点的位置。 【例】 a=b*c+b*d
1 2 a = 1 3 4 7 6 5 8 9
3
4 5 6 7 8 9
第8章 语义分析和中间代码生成
b
* c + b * d
8.2 中间代码
8.2.3 三地址码
1. 三地址码 (i)x := y op z (1) (2) (3) (4) t1:=b*c t2:=b*d t3:=t1+t2 a:=t3
(c,real)填入符号表,D.t =real
10
D
#
结束
8.3 自底向上语法制导翻译
第8章 语义分析和中间代码生成
8.3.2 说明语句的翻译
2. 数组说明的翻译
数组内情向量:存放数组的相关信息。
内情向量的地址存于符号表中。
数组引用的关键问题 —— 数组元素的地址计算
第8章 语义分析和中间代码生成
语义: E.val=T1.val+T2.val
E (E.val= T1.val+T2.val=12)
T1(T1.val=5)
第8章 语义分析和中间代码生成
T2(T1.val=7)
8.1 语义分析
8.1.2 语义的描述
(2)继承属性 一个文法符号N在产生式的右边出现,若它的t属性由该产生 式的左部非终结符或右部的其他符号的属性决定,则N.t为N的继 承属性。
第8章 语义分析和中间代码生成
8.1 语义分析
8.1.2 语义的描述
例:变量说明语句的文法 D→TL T→real | int L→id | L1, id T.type由real或int决定; 标识符表类型L.in由T.type确定, 且依次传给表中的每一个标识符。
语法制导翻译和中间代码生成

例3:变量的类型说明
规则
D TL T int Treal L L1,id
语义规则
L.in:=T.type T //将L.in属性值设置为T.type T.type=integer T.type:=real int L1.in:=L.in addtype(id.entry, L. in)
(后缀)逆波兰: ab*cd+ef-/-
-/* + Nhomakorabeaa b c d e -
f
14
(二)逆波兰表示
1、赋值语句的逆波兰表示 赋值语句 <变量>:=<表达式> 逆波兰表达式 <变量><表达式的逆波兰式>:= 例1: y:=(a+b)*c; yab+c*:= 2、转向语句的逆波兰表示 转向语句:goto <标号> 逆波兰式:<标号> LJ 例2:100:write(’晚上好’); …... goto 100; 逆波兰表示:100LJ
(1)若b是产生式左部A的一个属性,c1, c2, …, ck 是产生式右部符号或A的属性,则b是A的综合属 性。在分析树中,一个结点的综合属性值是从其 子结点的属性值计算出来的。 (2)若b是产生式右部符号X的一个属性, c1, c2, …, ck是A或右部符号的属性,则b 是X的继承属性。在分析树中,一个结点的 继承属性值是由该结点兄弟结点和父结点的 属性值计算出来的
D in 5 L 6 entry 3 , id3 real in 7 L 8 entry , in 9 L 10 id2 2 entry id1 1
9
4 T type
2、简单算术表达式求值: 用一个产生式进行归约时就执行相应的语义动作,在分 析一个句子时,句子的值同时产生。(自下而上分析)
上海大学编译原理第8章+语法制导翻译和中间代码生成

语义规则 E.val := E1.val + T.val E.val := T.val T.val := T1.val * F.val T.val := F.val F.val := E.val F.val := i.lexval
考虑2+3*5的语法制导翻译
E.val=17 T.val=2
F.val=2 T.val=3 +
例: while (a<b) do x:=y+z;
控制语句中布尔表达式的翻译
把条件转移的布尔表达式翻译成仅含条件真转 和无条件转的四元式
E
a rop b
E.true E.false
if a rop b goto E.true goto E.false
例: a<b or c<d and e<f
2+3*5的分析和计算过程
8.3 中间代码的形式
逆波兰记号(后缀式)
三元式
树形表示 四元式
表达式 a+b
逆波兰式 ab+
a+b*c
(a+b)*c a:=b*c+b*d
A+B*(C-D)+E/(C-D)^N
abc*+
ab+c* abc*bd*+:=
ABCD-*+ECD-N^/+
三元式和树形表示 格式: (op,arg1,arg2)
c
<
d
e
<
f
if语句的翻译 S if E then S1 else G‟[S]: | if E then S1 S CS |A S TS SA C if E then T CS else 语义变量
编译原理 之 语法制导翻译和中间代码生成

非终结符 有一个综合属性type,其值有 非终结符T有一个综合属性 有一个综合属性 其值有 关键字决定(int或real). 关键字决定 或 L.in=T.type, L.in是继承属性 它将沿着 是继承属性,它将沿着 是继承属性 语法树传递到下边的结点. 语法树传递到下边的结点 与L相联的语义规则中有一个过程调 相联的语义规则中有一个过程调 用—addtype把标识符的类型信息登录 把标识符的类型信息登录 在符号表中. 在符号表中 一个结点的继承属性值是由此结点的 父结点和/或兄弟结点的某些属性来决 父结点和 或兄弟结点的某些属性来决 定的. 定的
2+3*5的分析和计值过程 语义栈(值栈 值栈) 步骤 动作 状态栈 语义栈 值栈 符号栈 余留输入串
1) 2) 3) r6 4) r4 5) r2 6) 7) 8) r6 9)r4 10) 10) 11) 11) 12) 12)r6 13) 13)r3 14) 14)r1 15) 15)接受 0 - 05 -- 03 -2 02 -2 01 -2 016 -2- 0165 -2-- 0163 -2-3 0169 -2-3 01697 -2-3- 016975 -2-3-- 01697(10) -2-3-5 0169 -(15 15) -2-(15) 01 17) - (17) # 2+3*5# 5 #2 +3 *5# 5 #F +3*5# 5 #T +3*5# 5 #E +3*5# 5 #E+ 3*5# 5 #E+3 *5# #E+3 5 #E+F *5# #E+F 5 #E+T *5# #E+T 5 #E+T* 5# #E+T #E+T*5 #E+T 5 # #E+T*F # #E+T F #E+T # #E #
属性有两种— 属性有两种 继承属性和综合属性 综合属性用于“自下而上”传递 综合属性用于“自下而上” 信息. 信息 继承属性用于“自上而下”传递 继承属性用于“自上而下” 信息. 信息