- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章2008下
第8章 语法制导翻译和中间代码生成
语义处理和中间代码生成
HYPERLINK tu1.10.doc tu1.10.doc
8.1 中间代码
8.1.1逆波兰表示法
1.几种不同表示法
△中缀表示法(传统方法)
例如:A+B A加B
M≥1 M大于等于1
用中缀式来描述表达式时,括号绝对不能少,否则很多表达式就无法描述,例如:
(A+B)*C
这个括号总不能省去。
△前缀表示法(波兰表示)
A加B +A B
M大于等1 ≥M 1
△后缀表示法(逆波兰表示)
A加B AB+
M大于等于1 M1≥
比较,例如:
中缀 波兰 逆波兰
A+B*C +A*BC ABC*+
(A+B)*C *+ABC AB+C*
A*(B+C)/D /*A+BCD ABC+*D/
逆波兰方法的特点:
(1)无括号表示法,因而形式简洁。
(2)诸运算符的先后顺序与运算的先后顺序是一致的(不需要比较优先级)。中缀法无此2个优点,波兰法只有第一个优点。
2.后缀式与栈的关系
后缀式的计值可以用栈来表示。
HYPERLINK tu8.1.doc tu8.1.doc
3.后缀式的推广
△赋值句:左部:=表达式
逆波兰:左部表达式:=
【例】a:=b*c+b*d
表为:abc*bd*+:=
△条件语句
if 布尔表达式 then 语句1 else 语句2
先引入:
这是双目后缀运算符(布表式序号),
布尔表达式序号 意为:布尔表达式为假时,转到
序号处。
EMBED PBrush 是单目后缀运算符,
序号 EMBED PBrush 意为:无条件转到序号处。
则条件语句的逆波兰表示为:
布尔表达式序号1语句1序号2 EMBED PBrush 语句2
其中,序号1指的是语句2的第一个符号的序号,序号2指的是紧接在语句2后面的那个符号的序号。
【例】if xy then m1:=x else m2:=y;
写成逆波兰:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
x y 11 m1 x := 14 EMBED PBrush m2 y :=
这是一个数组,其中安放后缀式。
实验3 L: HYPERLINK 实验3-C.doc 实验3-C.doc
8.1.2 N元式和树
1.三元式
OP OPAN1 OPAN2
【例】A+B*C
(1) * B C
(2) + A (1)
注意:实现时这些操作数或是三元式表的表项位置或符号表的某一位置。
OP可用整数表示,也可用汇编形式的代码表示,又可分不同类型之OP,如整型加为IADD,实型加为RADD,可据情况而定。
【例】if xy
then z:=x
else z:=y+1
三元式表为:
(1)-,x,y {x-y}
(2)BMZ,(1),(5)
(3):=,z,x
(4)BR, ,(7)
(5)+,y,1
(6):=,z,(5)
(7)其它后续语句
BMZ表示为负或0(第1操作数)转移(按第2操作数);
BR表示必转(按第2操作数,第1操作数空)。
注意:在三元式上优化代码很难,因为三元式大量引用三元式表的项,故增、删(优化)三元式涉及到三元式引用情况(地址)的改变。因而一般不多用。其优点是无需临时变量,节省内存,本身表示式短,也节省了空间。
2.树(或语法树)
+(3)
*(1) *(2)
A B C D
表示:A*B+C*D
三元式是树的翻版。三元式的操作符相当于子树的根。
例如上述树结构表示成:
(1) * A B
(2) * C D
(3) + (1) (2)
在上述语法树上增加三元式的编号即可看出它们的等价性。
注:抽象语法树已在某些编译程序中被使用,如在不少Ada语言编译系统中,使用了一种称作Dinna的树结构作为中间代码。
4.四元式
是一种普遍采用的中间代码形式。形如:
OP ARG1 ARG2 RESULT
【例】a:=b*c+b*d
(1) * , b , c , t1
(2) * , b , d , t2
(3) + , t1 , t2 , t3
(4) := , t3 , _ , a
解说:
1°四元式和三元式的不同在于:四元式对中间结果的引用必须通过给定的名字,而三元则是引用三元式位置编号。亦即四元式之间的联系是通过临时变量实现的。
文档评论(0)