资源描述:
《语法制导翻译和中间代码生成new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第八章语法制导翻译和中间代码生成【课前思考】◇回顾第一章介绍的编译过程,理解语义分析在编译过程中的位置和作用。◇“属性文法”的概念及应用。◇“语法制导翻译”的概念及应用。◇什么是中间代码(中间表示),为什么要中间代码?【学习目标】明确语义分析在编译过程所处的阶段和作用。掌握属性文法的基本概念。使用属性文法和语法制导翻译方法描述具体的语义分析和产生中间代码。主要是要让同学们了解:1)语义的描述方式;2)语义的处理方法。【本章重点】1.几种典型的中间代码(语言)的形式;2.语义的描述方法—着重介绍一种形式化的语义描述方法—属性文法;3.语义的处理方法—着重介绍语法制导的翻译法—包括它的
2、两种具体形式:语法制导的定义和翻译方案。编译程序的任务是把源程序翻译成目标程序,这个目标程序必须和源程序的语义等同,也就是说,尽管它们的语法结构完全不同,但它们所表达的结果应完全相同。通常,在词法分析程序和语法分析程序对源程序的语法结构进行分析之后,要么由语法分析程序直接调用相应的语义子程序进行语义处理,要么首先生成语法树或该结构的某种表示,再进行语义处理。8.0概述第八章语法制导翻译和中间代码生成第一,审查每个语法结构的静态语义,即验证语法结构合法的程序是否真正有意义。有时把这个工作称为静态语义分析或静态审查。第二,如果静态语义正确,语义处理则要执行真正的翻译,即,或者将源程序翻
3、译成程序的一种中间表示形式(中间代码),或者将源程序翻译成目标代码。本章引入属性文法和语法制导翻译方法的基本思想,介绍几种典型的中间代码形式,最后讨论一些语法成分的翻译工作。编译中的语义处理是指两个功能:8.1属性文法(attributegrammar)属性文法(也称属性翻译文法)是Knuth在1968年首先提出的。它是在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“特性”(称为属性)。这些属性代表与文法符号相关信息,例如它的类型、值、代码序列、符号表内容等等。属性与变量一样,可以进行计算和传递。属性加工的过程即是语义处理的过程。为文法的每个产生式配备的
4、一组属性的计算规则,称为语义规则,称为语义规则。所谓属性,其涉及的概念比较广泛,常用以描述事物或人的特征、性质,品质等等。比如,谈到一个物体,可以用"颜色"描述它,谈起某人,可以使用"有幽默感"来形容他。对编译程序使用的语法树的结点,可以用"类型"、"值"或"存储位置"来描述它。一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作,从而实现语义处理。8.1.1属性文法定义定义1:形式上讲,属性文法是一个三元组:A=(G,V,F),其中:G:是一个上下文无关文法;V:有穷的属性集,
5、每个属性与文法的一个终结符或非终结符相联,这些属性代表与文法符号相关信息;F:关于属性的属性断言或一组属性的计算规则(称为语义规则)。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。定义2:一个属性文法是一个三元组:A=(G,V,F),其中G--基础文法(一个上下文无关文法)V--每个文法符号有一组属性F--每个文法产生式A有一组形式为b:=f(c1,c2,…,ck)的语义规则,其中f是函数,b和c1,c2,…,ck是该产生式文法符号的属性。属性文法中的属性分成两类:继承属性和综合属性。简单地说,综合属性用"自下而上"传递信息,而继承属性用
6、于"自上而下"传递信息。综合属性(synthesizedattribute):如果b是A的属性,c1,c2,…,ck是产生式右部文法符号的属性或A的其它属性,则称b是文法符号A的综合属性。继承属性(inheritedattribute):如果b是产生式右部某个文法符号X的属性,并且c1,c2,…,ck是A或产生式右部文法符号的属性,则称b是文法符号X的继承属性。每个文法产生式A有一组形式为b:=f(c1,c2,…,ck)的语义规则,其中f是函数,b和c1,c2,…,ck是该产生式文法符号的属性属性文法的主要思想是:1.对每个文法符号引入相关的属性符号;2.对于每个产生式设置一组
7、计算属性值的属性规则(语义规则),其形式为:b:=f(c1,c2,…,ck)即:属性变量:=<属性表达式>这里f是一个函数,且对于产生式A,(1)b或者是A的一个综合属性并且c1,c2,…,ck是产生式右边文法符号的属性;(2)b或者是产生式右边某个文法符号的一个继承属性并且c1,c2,…,ck是A或产生式右边任何文法符号的属性。在两种情况下,我们都说属性b依赖于属性c1,c2,…,ck。即:属性规则中的左部b能写那些属性变量是有规定的,只能为下述两种变量:①产生