- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理ppt7_1.ppt
第七章 中间代码生成 汪志华 edgar_wang@ 7.1 中间语言 后缀式 图形表示法:语法树、DAG图表示 三地址代码:三元式、四元式、间接三元式 静态单赋值形式 7.1.1 后缀表示 后缀式(逆波兰表示):运算量(操作数)在前,运算符在后 例: a+b → ab+ a*(b+c) → abc+* -a+b*c → a@bc*+ 一个表达式的后缀式可以如下定义: 1.如果E是一个变量或常量,则E的后缀式是E自身。 2.如果E是E1 op E2形式的表达式,这里op是任何二元操作符,则E的后缀式为 E1E2op,这里E1和E2分别为E1和E2的后缀式。 3.如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。 把表达式翻译成后缀式的语义规则描述 产生式 语义规则 E→E1 op E2 E.code:=E1.code‖E2.code‖op E→(E1) E.code:=E1.code E→id E.code:=id 后缀表示的特点 便于计算机处理表达式 难以用栈描述赋值语句和控制语句的计算 7.1.2 图形表示 语法树(参见4.2节):描绘了源程序在语义上的层次结构 有向无环图(directed acyclic graph, DAG) 在一个DAG中代表公共子表达式的结点具有多个父结点,而在一棵语法树中公共子表达式被表示为重复的子树 构造赋值语句语法树的语法制导定义 例 a:=b*-c+b*-c的图表示法 7.1.3 三地址代码 三地址代码是由一般形式的语句构成的序列: x:=y op z 每个语句的右边只能有一个运算符 例如 x+y*z的三地址表示 t1:=y*z t2:=x+t1 三地址码是语法树或dag的线性表示,在三地址码中,显式名字对应于图的一个内节点 a := (?b + c?d ) + c?d的DAG代码 t1=-b t2=c*d t3=t1+t2 t4=t3+t2 a=t4 三地址语句的类型 x:=y op z x:=op y x:=y goto L if x relop y goto L或if a goto L param x和call p,n,以及返回语句return y x:=y[i]及x[i]:=y的索引赋值 x:=y, x:=*y和*x:=y的地址和指针赋值 7.1.4 静态单赋值形式 静态单赋值形式(static single-assignment form, SSA)是一种便于某些代码优化的中间表示 SSA中间赋值都是对不同名字变量的赋值 它使用一种称为Φ函数的记号约定,以组合变量的两个定值 例 例 if (flag) x=-1; else x=1; y=x*a; 的SSA形式 if (flag) x1=-1; else x2=1; x3=Φ(x1,x2); y=x3*a; * * 语法分析器 静态检查器 中间代码产生器 优化器 采用中间语言的优点: 重置目标(retargeting)比较容易 可以在中间表示上应用与机器无关的代码优化器 中间代码 assign a + + ? ? b c d c d uminus assign a + + ? b c d uminus (a) 语法树 (b) DAG a := (?b + c?d ) + c?d的图形表示 E.nptr := mkleaf (id, id.entry) F ? id E.nptr := E1.nptr E ? (E1) E.nptr := mkunode( ‘uminus’, E1.nptr) E ? ?E1 E.nptr := mknode( ‘?’, E1.nptr, E2.nptr) E ? E1 ?E2 E.nptr := mknode( ‘+’, E1.nptr, E2.nptr) E ? E1 +E2 S.nptr := mknode(‘assign’, mkleaf (id, id.entry), E.nptr) S ? id :=E 语 义 规 则 产 生 式 如果mkunode(op,child)和mknode(op,left,right)尽可能返回指向现存节点的指针,而不是构建一个新的节点的话,那上述语法制导定义可以生成DAG assign a + * b uminus c 语法树 DAG assign a + * * uminus b uminus c c b a := (?b + c?d ) + c?d 语法树的代码 t1 := ?b t2 := c ? d t3 := t1 + t2 t4 := c
您可能关注的文档
最近下载
- 第十章正交试验设计.ppt VIP
- 鲁拜集(黄克孙郭沫若对照).pdf VIP
- (2025秋新版)青岛版三年级科学上册《5 .制作动物分类图册》PPT课件.pptx VIP
- 2025年(精品)成都七中学校自主招生考试试题 .pdf VIP
- 小学二年级新学期家长会班主任发言稿.docx VIP
- 现浇箱梁专项施工方案.doc VIP
- 北师大版数学二年级下册 长方形与正方形.ppt VIP
- QFSN-600-2型发电机铁心损坏分析 Analysis on Damage of QFSN-600-2 Generator Core.pdf VIP
- 小学二年级新学期家长会班主任发言稿.pdf VIP
- 小箱梁吊装履带吊安拆方案.docx VIP
文档评论(0)