第八章_语法制导翻译和中间代码生成.ppt

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章_语法制导翻译和中间代码生成

第八章 语法制导翻译和中间代码生成 语法制导翻译概论 中间代码的形式 简单算术表达式和赋值语句的翻译 布尔表达式的翻译 §8.1 语法制导翻译概论 一、属性文法 目前许多编译程序的语义分析均采用语法制导翻译方法,它比较接近形式化。 语法制导翻译法采用属性文法为工具来说明程序设计语言的含义。 属性是文法符号的语义性质的表示。对于文法中的某个终结符或非终结符,其属性可以有“类型”、“值”或“存储位置”等。 一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每一个产生式上。 形式上讲,一个属性文法是一个三元组 A=(G,V,F) G:一个上下文无关文法 V:一个属性的有穷集 F:关于属性的断言或谓词的有穷集 其中:每个属性与文法的某个非终结符或终结符相联,每个断言与文法的某个产生式相联,如果对G中的某一输入串而言(句子),A中的所有断言对该输入串的语法树结点的属性全为真,则该串也是A语言中的句子。 例1、有文法G为 E ?T1+T2|T1 or T2 T?num|true|false 属性文法中用N.t表示与非终结符N相联的属性,如,对上述表达式的类型检查的属性文法可表示如下: E ?T1+T2 {T1.t=int AND T2.t=int} E ?T1 or T2 {T1.t=bool AND T2.t=bool} T ?num {T.t=int } T ?true {T.t=bool } T ? false {T.t=bool } 例2、简单算术表达式求值的语义描述 产生式 语义规则 (0)L ?E print(E.val) (1)E ?E1+T E.val:=E1.val+T.val (2) E ?T E.val:=T.val (3)T ?T1*F T.val:=T1.val*F.val (4)T ?F T.val:=F.val (5)F ?(E) F.val:=E.val (6)F ?digit F.val:=digit.lexval 例3.说明语句中变量的类型信息的语义规则 (1)D ?TL L.in:=T.type (2)T ?int T.type:=integer (3)T ?real T.type :=real (4)L ?L1,id L1.in:=L.in addtype(id.entry,L.in) (5)L ?id addtype(id.entry,L.in) 该语义规则中的addtype为一过程调用,其功能是把每个标识符的类型信息登录在符号表的相关项中。 属性文法最早出自克努特笔下,它将属性分为两类:综合属性和继承属性。 综合属性:从语法分析树的角度来看,如果一个节点的某一属性,其值由子节点的属性值来计算则称该属性为综合属性。有时把内在属性也看作是综合属性。 继承属性:在语法树分析中,若一个节点的某个属性值由该节点的兄弟结点或父节点的属性值来计算,则此节点的该属性称为继承属性。 二、语法制导翻译 产生中间代码的一种简单办法是让每个产生式对应一个语义子程序。 在自上而下语法分析中,若一个产生式匹配输入串成功,或者在自下而上分析中,当一个产生式被用于归约时,此产生式相应的语义子程序就进入工作。 一个语义子程序描述了一个产生式所对应的翻译工作,这些翻译工作在很大程度上取决于要产生什么形式的中间代码。 包括:改变编译程序某些变量的值,查填各种符号表,诊察与报告源程序错误,产生中间代码等。 在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(语义动作)进行翻译(产生中间代码)的方法叫做语法制导翻译法。 语法制导翻译方法既可用来产生各种中间代码,也可用来产生目标指令,甚至可用来对输入串进行解释执行。 三.语法制导翻译的具体实现途径 假定有一个自底向上分析器LR(1),可将LR(1)分析器的能力加以扩大,使之能在用某个产生式进行归约的同时调用相应的语义子程序进行有关的翻译工作,每个产生式的语义子程序执行之后,某些结果(语义信息)必须作为此产生式的左部符号的语义值暂时保存下来,以便以后语义子程序引用这些信息。 三.语法制导翻译的具体实现途径 §8.2 中间代码的形式 常见的中间语言有逆波兰记号、三元式、四元式和树形表示。 源程序的中间代码是在编译程序将高级语言程序翻译成汇编语言或机器代码的过程中产生的,使用中间代码形式的优点: 可以不考虑机器特性; 可移植性; 便于优化处理。 一、逆波兰表示法 逆波兰表示,也称后缀式,即运算量在前,算符写在后面,该方法可在不使用括号的情况下,无二义性地说明算术表达式。逆波兰表示不仅能用来作为算术表达式的中间代码形式,

文档评论(0)

cgtk187 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档