- 1、本文档共26页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 语法制导翻译和中间代码生成 教学要求:本章介绍编译程序的第三个阶段语义分析及中间代码生成的设计原理和实现方法,要求理解语法制导翻译、语义动作的基本概念;掌握属性文法和中间代码。 教学重点:语法制导翻译基本思想,语法制导翻译概述,基于属性文法的处理方法,中间代码的表示形式。 1、属性文法(说明语言语义的工具)定义 属性文法是一个三元组:A=(G,V,F),其中: G:是一个上下文无关文法。 V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连。如它的类型、值、代码序列、符号表内容等等。 F:关于属性的属性断言或一组属性的计算规则(称为语义规则) . 断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性. 例1:定义表达式的文法如下: E?E+E E?(E) E?n 给出定义表达式值的属性文法。 为文法符号E引进属性符号val,用E.val表示E的值,属性计算规则以赋值语句的形式给出,附在每个产生式后,并用大括号括起来。为了明确E的不同出现位置,用上角标区别。终结符n的值是词法分析程序提供的,这里用n.lex表示。下面给出属性文法: E?E1+E2 {E.val := E1.val +E2.val} E?(E1) {E.val := E1.val } E?n {E.val := n.lex} 属性文法的主要思想有两点: 首先对于每个文法符号引进相关的属性符号; 其次对于每个产生式写出属性值计算的规则。 2、属性分类 综合属性:一个结点的属性值是从其子结点的属性值计算 出来的。 继承属性:一个结点的属性值是由该结点兄弟结点和父结点的属性值计算出来的。 例2:说明语句语法制导定义(属性文法) L.in:=T.type T.type:=integer T.type:=real L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in) 例2:real id1,id2,id3 的分析树和属性计算 后缀式并不局限于二元运算的表达式,可以推广到任何语句,只要遵守操作数在前,操作符紧跟其后的原则即可。典型的例子如if-then-else语句: if e then x else y 将if-then-else看作一个完整的操作符,则e、x和 y分别是三个操作数,这显然是一个三元运算。根据后缀式的特点,它的后缀式可以写为: exy if-then-else(记为: exy¥) 但是,这样的表示有个弱点。按照算法的计算次序,e、x和y均需计算,而实际上,根据条件e的取值,计算x则不计算y,计算y则不计算x。 * 语义处理功能: 1、静态语义审查:验证语法结构合理的程序是否真正有意义。 2、解释执行动态语义、生成代码:执行真正的翻译(生成中间代码或目标代码)。 8.1 属性文法 3、属性的计算 综合属性计算 自底向上按照语义规则来计算各结点的综合属性值 继承属性计算 根据依赖关系决定计算顺序 例1 台式计算器程序的语法制导定义 产生式 语义规则 {print(E?val)} {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:=digit?lexval} 1、与L→E相连的语义规则是一个过程,打印E的值,理解为L的属性是虚的或空的。 2、E,T,F的属性val都为综合属性。 3、lexval 是单词 digit 的属性(由词法程序提供)。 L?E E?E1+T E?T T?T1*F T?F F?(E) F?digit digit?lexval:=3 F?val:=3 T?val:=3 digit?lexval:=5 F?val:=5 T?val:=15 * E?val:=15 + digit?lexval:=4 F?val:=4 T?val:=4 E?val:=19 L 例 5 .2 输入:3*5+4 entry 单词id的属性 addtype 在符号表中为变量填加标识符的类型信息 D→TL T→int T→real L→L1,id L→id real T.type=real id1 L.in=real , id2 L.in=re
文档评论(0)