编译原理第5单元语义分析和中间代码产生.pptVIP

编译原理第5单元语义分析和中间代码产生.ppt

  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文档。上传文档
查看更多
编译原理第5单元语义分析和中间代码产生

第五章语法制导翻译和中间代码产生 语义分析的任务:根据语法成分的结构,分析其含义,并用一种内部形式(中间代码)或直接用目标语言表示出来。 具体:静态语义检查和翻译 包括:类型检查(操作符是否相容,例如%) 控制流检查(break是否有switch和for,while) 一致性检查(int a; float a;) 相关名字检查、等等 §5.1 属性文法 一、属性 一、属性:一般用来描述客观存在的事物或人的特性。例如,学生的姓名、年龄、性别等;商品的颜色、重量、单价等。编译技术中用属性来描述计算机处理对象的特征。例如:X . Type , X . Place , X.val等分别描述X的类型,存储位置、值等不同的特征。 属性分两类: 综合属性:一般用于“自下而上”传递信息。 继承属性:一般用于“自上而下”传递信息。 二、属性文法 对于某个压缩了的上下文无关文法,当为每个文法符号引进一组属性,且让该文法中的重写规则附加以语义规则时,称该上下文无关文法为属性文法。 形式定义:一个属性文法形式上定义为一个三元组AG, AG=(G , V , E)。其中G表示一个上下文无关文法;V表示属性的有穷集;E表示属性的断言或谓词的有穷集。 三、综合属性 从语法分析树的角度来看,如果一个结点的某一属性,其值由子结点的属性之值来计算,则称该属性为综合属性。 综合属性用于“自下而上”传递信息。 例1:算术表达式求值的属性文法。 规则式 语义规则 1.L→E print(E.val) 2.E→E1+T E.val:=E1.val+T.val 3.E→T E.val:=T.val 4.T→T1*F T.val:=T1.val*F.val 5.T→F T.val:=F.val 6.F→(E) F.val:=E.val 7.F→digit F.val:=digit.lexval 四、继承属性 语法树分析中,若一个结点的某个属性之值由该结点的兄弟结点和/或父结点的属性之值来计算,则此结点的属性称为继承属性。 继承属性用于“自上而下”传递信息。 例2、说明语句中简单变量类型信息的属性文法。 规则式 语义规则 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) 五、属性的初始值 ① 终结符号只有综合属性,它们由词法分析器提供。 ② 非终结符号既有综合属性也可有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值。 §5.2 语法制导翻译法 语法制导翻译法的基本思想:对文法的每一条产生式,设计语义子程序。在语法分析的过程中,当使用一条产生式推导或归约时,调用该语义子程序进行属性计算,完成预定的翻译工作。 语法制导翻译法:在语法分析的过程中,依随分析过程,根据每个产生式添加的语义动作进行翻译的方法。 语义子程序 语义子程序也称为翻译子程序,语义动作。它描述了有关产生式所对应的翻译工作。语义动作一方面指出了产生式所对应的符号串的意义;另一方面又按照这种意义规定了对应的属性计算加工动作。 语义动作: 查填各种表格 计算某变量的值 生成某种中间代码 打印错误信息等等 LR分析制导的具体实现方法 1、为文法产生式设计语义子程序。 2、为文法构造一张无冲突的LR分析表。 3、修改总控程序,归约时调用语义子程序。 4、扩充LR分析栈,用来存放各文法符号对应的语义信息。 例如: (1).E→E1+E2 {E.val=E1.val+E2.val} (2).E→E1*E2 {E.val=E1.val*E2.val} (3). E→(E1) {E.val=E1.val} (4).E→digit {E.val=lex.digit} 扩充的LR分析栈: §5.3 中间语言 常用的中间语言有: 一、逆波兰式 二、三元式与间接三元式 三、树形表示法 四、四元式 一、逆波兰式 1、逆波兰式(后缀式):每一运算符都置于其运算对象之后。(无括号表达式) 中缀表示 后缀表示 A*B AB* A+B*C ABC*+ (A+B)*(C+D) AB+CD+* (a==0b3)||(ex!=y) a0==b3exy!=|| 2、LR分析制导生成逆波兰式 文法: 0 E′→E {空} 1 E→E(1)+E(2) {print +} 2 E→

文档评论(0)

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

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

1亿VIP精品文档

相关文档