第7章语义分析与中间代码生成.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7 语义分析与中间代码生成 内容提要 中间语言 声明语句的语义处理 表达式及赋值语句的翻译 控制语句的翻译 过程或函数调用语句的翻译 7.1 几种常见的中间语言 图表示法 语法树:分析树的压缩形式,去掉了分析树中与语义无关紧要的成分。 有向无环图(Directed Acyclic Graph, DAG):把表达式的公共子表达式看成是等同的,所有公共子表达式共享一个结点。 例如,赋值语句a = b * ?c + b * ?c的语法树和DAG 三地址代码 1.三地址代码的形式 三地址代码语句的一般形式为 x=y op z 其中,x、y和z为(变量的)名字、常量或编译时产生的临时变量;op为运算符。 三地址代码的每条语句通常包含三个地址,两个用来存放运算对象,一个用来存放运算结果。 由于三地址语句的右边只含有一个运算符,因此多个运算符组成的表达式必须用三地址语句序列来表示,如表达式 x + y * z 的三地址代码为: t1 = y * z t2 = x + t1 其中,t1和t2是编译时产生的临时变量。 2.三地址语句的种类 三地址语句非常类似于汇编代码,它可以有符号标号和各种控制流语句。 常用的三地址语句: (1) x = y op z形式的赋值语句,其中op为二目的算术运算符或逻辑运算符。 (2) x = op y形式的赋值语句,其中op为一目运算符,如一目减uminus、逻辑否定not、移位运算符以及类型转换符。 (3) x = y形式的复制语句,将y的值赋给x。 (4) 无条件转移语句goto L,即下一个将被执行的语句是标号为L的语句。 (5) 条件转移语句if x rop y goto L,其中rop为关系运算符,如、=、==、!=、、=等。若x和y满足关系rop就转去执行标号为L的语句,否则继续按顺序执行本语句的下一条语句。 (6) 过程调用语句par x和call p,n。源程序中的过程调用语句p(x1, x2, …, xn)可用下列三地址代码表示: par x1 par x2 ? par xn call p,n 其中,整数n为实参个数。 过程返回语句为return y,其中y为返回值,可选。 (7) 变址赋值语句x = y[i],表示把从地址y开始的第i个地址单元中的值赋给x。x[i] = y则表示把y的值赋给从地址x开始的第i个地址单元。 (8) 地址和指针赋值语句 ① x = y表示将y的地址赋给x,y可以是一个名字或一个临时变量,而x是一个指针; ② x = *y表示将y所指示的地址单元中的内容赋给x,y是一个指针; ③ *x = y表示将x所指对象的值置为y的值。 3.三地址代码的实现 三地址代码是中间代码的一种抽象形式。在编译程序中,可以以带有操作符和操作数域的结构体来实现。 1) 四元式 四元式是具有四个域的结构体,形如 (op,arg1,arg2,result) 其中,op为运算符;arg1、arg2及result为指向有关名字在符号表中的登记项或一临时变量的指针,也可空缺。 常用的三地址语句与相应的四元式: x = y op z 对应(op, y, z, x) x = ?y 对应(uminus, y, _, x) x = y 对应(=, y, _, x) par x1 对应(par, x1, _, _) call P 对应(call, _, _, P) goto L 对应(j, _, _, L) if x rop y goto L 对应(jrop, x, y, L) 例如,赋值语句a = b * (c + d)的四元式代码: ① (+, c, d, t1) ② (*, b, t1, t2) ③ (=, t2, _, a) 约定:一元运算符一律使用arg1。此外,如果op是一个算术或逻辑运算符,则result总是一个新引进的临时变量,它用来存放运算结果。 结论:四元式出现的顺序与表达式计值的顺序是一致的,四元式之间的联系是通过临时变量实现的。四元式由于其表示更接近程序设计的习惯而成为一种普遍采用的中间代码形式。 2) 三元式 三元式具有三个域,形如(op,arg1,arg2)。其中,op为运算符;arg1、arg2既可指向符号表中的表项或临时变量,也可指向某个三元式。 例如,赋值语句a=(b+c)*(b+c)的三元式代码: ① (+,b,c) ② (+,b,c) ③ (*,①,②) ④ (=,a,③) 结论:三元式出现的先后顺序和表达式各部分的计值顺序是一致

文档评论(0)

jdy261842 + 关注
实名认证
文档贡献者

分享好文档!

1亿VIP精品文档

相关文档