ch6 语义分析及中间代码生成.ppt

  1. 1、本文档共141页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 属性文法 第六章 语义分析与中间代码生成 6.1 语义分析的任务 6.2 语法制导翻译 6.2.1 属性文法的定义 6.2.2 基于属性文法的处理方法 6.2.3 S—属性文法的自下而上计算 6.2.4 L—属性文法和自顶向下翻译。 6.3 中间代码生成 6.1 语义分析的任务 源程序经过词法分析、语法分析后,表明该源程序书写正确、符合程序语言所规定的语法,但语法分析并未对程序内部的逻辑含义加以分析,因此编译程序接着进行语义分析,即审查每个语法成分的静态语义。如果静态语义正确,则生成与该语言成分等效的中间代码,或直接生成目标代码。 6.1 语义分析的任务 语义分析进行的语义检查有两类:动态语义检查和静态语义检查。动态语义检查需生成相应的目标代码,在运行时进行;静态语义检查在编译时进行。 6.1 语义分析的任务 静态语义检查涉及以下几个方面: (1)类型检查,如运算操作数的类型应相容。 (2)控制流检查,用以保证控制语句有合法的 转向点。如C语言中不允许goto语句转入 case语句流;break语句需寻找包含它的最 小switch、while或for语句方可找到转向点。 (3)一致性检查,如在相同作用域中标识符只 能说明一次。 6.2 语法制导翻译 程序语言的词法和语法结构可分别用正规式和上下文无关文法来描述,已建立成熟的形式化描述方法。 由于语义是上下文有关的,因此语义的形式化描述非常困难,目前较常见的是用属性文法作为描述语义的工具,并采用语法制导翻译法完成对语法成分的翻译。该方法在语法分析的同时进行语义分析。 6.2.1 属性文法的定义 要利用语法制导的翻译方法,就需要在一个上下文无关文法的基础之上赋予每个文法符号以一定的属性,并规定文法的每个产生式对相关属性的运算规则,这种附加了一组属性和运算规则的文法称为属性文法。 例如:对一个算数表达式进行翻译,不仅要知道各个运算符的先后次序,而且还要知道表达式中各个变量和常量的数据类型、内存地址或值,还要知道中间结果存放的内存地址和值,这些信息被称为语义信息,也称为属性。 6.2.1 属性文法的定义 属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。这些属性代表与文法符号相关的信息,例如它的类型、值、代码序列?、符号表内容等等。属性和变量一样,可以进行计算和传递,依据则是语义规则。 属性的运算规则又称为语义规则或语义子程序,与相应的产生式密切相关,属性的值是由语义规则计算出来的,而语义规则的计算可以产生中间代码或目代码。 属性的表示 在属性文法中,文法符号X的属性t常用X.t来表示。例如:X.val、X.type、X.addr分别表示X的值、类型和地址。 例如:对于算数表达式文法G[E]: 如果只想计算表达式的值,则只需关心各文法符号的值属性,因此对每个非终结符都有一个整数值的属性,分别为E.val、T.val、F.val,i的属性为i.lexval。其他终结符+、*、(、)都代表语义动作,将在语义规则中反映。 语义规则的表示 一个产生式对应的语义规则是根据产生式所蕴涵的语义操作所建立的,并与语义分析的目标有关。 例如文法G[E],已表达式求值为目标构造各产生式的语义规则如下: 6.2.2 基于属性文法的处理方法 用属性描述语义信息,用语义规则描述属性间的关系,将语义规则与语法规则相结合,在语法分析的过程中通过执行语义动作,计算语义属性的值,从而完成预定的翻译工作。这就是语法制导翻译的思想。 具体实现时,语法制导翻译有两种处理方法: 语法制导定义,即对每个产生式编制一个语义分析子程序,在进行语法分析的过程中,当一个产生式获得匹配时,就调用相应的语义分析子程序检查与翻译。这种实现方案隐藏了语义规则的计算次序等细节问题,不必规定翻译顺序。 翻译模式,即在产生式右部的适当位置,插入相应的语义动作,按照分析的进程,执行遇到的语义动作。 语法制导的定义 属性一般分为两类:综合属性和继承属性。简单的说,综合属性用于“自下而上”传递信息,而继承属性用于“自上而下”传递信息。 语法制导的定义 综合属性:在语法树中,一个结点的综合属性的值由其子结点的属性值确定。因此,通常使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值。 继承属性:在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定。用继承属性来表示程序语言结构中的上下文依赖关系很方便 语法制导的定义 在一个属性文法中,对应于每个产生式A??都有一套与之相关联的语义规则,每条语义规则的形式为: b:=f(c1,c

文档评论(0)

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

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

1亿VIP精品文档

相关文档