语法制导翻译和中间代码生成new.ppt
《语法制导翻译和中间代码生成new.ppt》由会员分享,可在线阅读,更多相关《语法制导翻译和中间代码生成new.ppt(131页珍藏版)》请在三一办公上搜索。
1、第八章 语法制导翻译和中间代码生成,【课前思考】回顾第一章介绍的编译过程,理解语义分析在编译过程中的位置和作用。“属性文法”的概念及应用。“语法制导翻译”的概念及应用。什么是中间代码(中间表示),为什么要中间代码?,【学习目标】,明确语义分析在编译过程所处的阶段和作用。掌握属性文法的基本概念。使用属性文法和语法制导翻译方法描述具体的语义分析和产生中间代码。主要是要让同学们了解:)语义的描述方式;)语义的处理方法。,【本章重点】,1.几种典型的中间代码(语言)的形式;2.语义的描述方法 着重介绍一种形式化的语义描述方法属性文法;3.语义的处理方法 着重介绍语法制导的翻译法包括它的两种具体形式:语
2、法制导的定义和翻译方案。,编译程序的任务是把源程序翻译成目标程序,这个目标程序必须和源程序的语义等同,也就是说,尽管它们的语法结构完全不同,但它们所表达的结果应完全相同。通常,在词法分析程序和语法分析程序对源程序的语法结构进行分析之后,要么由语法分析程序直接调用相应的语义子程序进行语义处理,要么首先生成语法树或该结构的某种表示,再进行语义处理。,8.0 概述,第八章 语法制导翻译和中间代码生成,第一,审查每个语法结构的静态语义,即验证语法结构合法的程序是否真正有意义。有时把这个工作称为静态语义分析或静态审查。第二,如果静态语义正确,语义处理则要执行真正的翻译,即,或者将源程序翻译成程序的一种中
3、间表示形式(中间代码),或者将源程序翻译成目标代码。本章引入属性文法和语法制导翻译方法的基本思想,介绍几种典型的中间代码形式,最后讨论一些语法成分的翻译工作。,编译中的语义处理是指两个功能:,8.1 属性文法(attribute grammar),属性文法(也称属性翻译文法)是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是该产生式文法符号的属性。,属性文法中的属性分成两类:继承属性和综合属性。,简单地说,综合属性用自下而上传递信息,而继承属性用于自上而下传递信息。,综合属性(synthesized at
6、tribute):如果b是A的属性,c1,c2,ck是产生式右部文法符号的属性或A的其它属性,则称b是文法符号A的综合属性。继承属性(inherited attribute):如果b是产生式右部某个文法符号X的属性,并且c1,c2,ck是A或产生式右部文法符号的属性,则称b是文法符号X的继承属性。,每个文法产生式A有一组形式为b:=f(c1,c2,ck)的语义规则,其中f 是函数,b和c1,c2,ck是该产生式文法符号的属性,属性文法的主要思想是:,1.对每个文法符号引入相关的属性符号;2.对于每个产生式设置一组计算属性值的属性规则(语义规则),其形式为:b:=f(c1,c2,ck)即:属性变
7、量:=这里 f是一个函数,且对于产生式A,(1)b或者是A的一个综合属性并且c1,c2,,ck是产生式右边文法符号的属性;(2)b或者是产生式右边某个文法符号的一个继承属性并且c1,c2,,ck是A或产生式右边任何文法符号的属性。在两种情况下,我们都说属性b依赖于属性c1,c2,,ck。,即:属性规则中的左部b能写那些属性变量是有规定的,只能为下述两种变量:产生式左部符号的综合属性变量;产生式右部符号的继承属性变量。,2.对于每个产生式设置一组计算属性值的属性规则(语义规则),其形式为:b:=f(c1,c2,ck)即属性变量:=,这里 f是一个函数,且对于产生式A,(1)b或者是A的一个综合属
8、性并且c1,c2,ck是产生式右边文法符号的属性;(2)b或者是产生式右边某个文法符号的一个继承属性并且c1,c2,ck是A或产生式右边任何文法符号的属性。在两种情况下,我们都说属性b依赖于属性c1,c2,ck。,继承属性的求值规则:产生式左部非终结符号的继承属性值取(来自于)前面产生式右部该符号已有的继承属性值;产生式右部符号的继承属性值用该产生式左部符号的继承属性或出现在该符号左部的符号的属性值进行计算。,体现自顶向下,自左向右的求值特性,体现自底向上,自右向左的求值特性,综合属性的求值规则:产生式右部非终结符号的综合属性值取(来自于)其下面产生式左部同名非终结符号的综合属性值;产生式左部
9、非终结符号的综合属性值用该产生式左部符号的继承属性或某个右部符号的属性进行计算;,例8.1 有文法G为:ET1+T2|T1 or T2Tnum|true|false 对输入串3+4的类型检查的属性文法如图8.1。,ET1+T2 T1.tintANDT2.tintET1orT2 T1.tboolAND T2.tboolTnum T.tintTtrue T.tboolTfalse T.tbool,图8.1 类型检查的属性文法,属性文法记号中常使用N.t的形式表示与非终结符N相联的属性t。比如可把对上面表达式的类型检查的属性文法写成图8.1的形式。与每个非终结符T相联的有属性t,t要么是int,要么
10、是bool。与非终结符E的产生式相联的语义规则指明:两个T的属性必须相同。图8.2的(b)是图8.2(a)语法树结点带有语义信息的表示。,图8.2 静态语义审查,8.1.2 属性的确定,写属性文法,首先应确定对于每个文法符号都有哪些属性,然后给每个属性起个名字,接着确定每个属性的类别。要特别强调的是:(1)终结符只有综合属性,它们的值由词法分析器提供;(2)非终结符既可有综合属性也可有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值要在计算(整个处理)开始时指定。,正确确定综合属性和继承属性是非常重要的,究竟哪些属性确定为综合属性,哪些属性确定为继承属性,并没有固定的模式。,例8.2
11、 简单算术表达式求值的语义描述。,产生式 语义规则 LE print(E.val)E E1+T E.val E1.val+T.valET E.val T.valT T1*F T.val T1.val*F.val TF T.val F.valF(E)F.val E.valFdigit F.val digit.lexval,在该描述中,大多数非终结符都有一个属性:一个整数值的称作val的属性。按照语义规则对每个产生式来说,它的左部E,T,F的属性值的计算来自它右部的非终结符,这种属性称作综合属性。单词digit仅有综合属性,它的值是由词法分析程序提供的。和产生式LE相联的语义规则是一个过程,打印由
12、E产生的表达式的值。我们可以理解为L的属性是空的或是虚的。,例 8.3描述说明语句中各种变量的类型信息的语义规则。,产生式 语义规则(1)DTL L.inT.type(2)Tint T.Typeinteger(3)Treal T.Typereal(4)LL1,id L1.inL.in;addtype(id.entry,L.in)(5)Lid addtype(id.entry,L.in),例8.3中的文法定义了一种说明语句,该说明语句的形式是由关键字int或real开头,后面是一个标识符表,每个标识符用逗号隔开。非终结符T有一个综合属性type,它的值由关键字决定(int或real)。与产生式D
13、TL相联的语义规则L.inT.type将L.in(继承属性)的属性值置为该说明语句指定的类型。属性L.in将被沿着语法树传递到下边的结点使用,与L产生式相联的规则里使用了它。这个例子里,继承属性L.in在说明中为各个标识符提供类型信息。,图8.4是句子int id1,id2的语法树,使用表示属性的传递情况。在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定。与L产生式相联的语义规则中有一个过程调用addtype,过程addtype的功能是把每个标识符的类型信息登录在符号表的相关项中。,图 8.4 属性信息传递情况,8.1.3 属性计算规则的确定,一般说来,对产生式右部符
14、号的继承属性和产生式左部符号的综合属性都必须提供一个计算规则。属性计算规则中只能使用相应产生式中的文法符号的属性,这有助于在产生式范围内“封装”属性的依赖性。然而,对产生式左部符号的继承属性和产生式右部符号的综合属性不由所给的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算或者由属性计算器的参数提供。,属性文法看作是允许为每个终结符和非终结符配备一些属性的文法。它既能描述程序设计语言的语法,又为语义处理提供了方便。,属性文法里的属性有不同的类型,可以象变量一样地被赋值。赋值规则附加于语法规则之上。赋值与语法同时进行,赋值过程就是语义处理过程。在推导或者归约的时候,诸属性的值被计算并
15、通过赋值规则层层传递。有的从语法规则左边向右边传,有的从右边向左边传。语法推导树最后完成时,就得到开始符号的属性值。也就是整个源程序的语义。,中间代码,也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。为什么有的编译程序直接生成目标代码,有的编译程序采用中间代码。一般,快速编译程序直接生成目标代码,没有将中间代码翻译成目标代码的额外开销。但是为了使编译程序结构在逻辑上更为简单明确,常采用中间代码。这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作使得代码优化比较容易实现。,8.2 中间代码(语言),中间代码(语言)是一种特殊结构的语言,编
16、译程序所使用的中间代码有多种形式。按其结构分常见的有逆波兰式(后缀式)、三地址代码(三元式、四元式)和树形表示(抽象语法树)、DAG表示。8.2.1 逆波兰式(后缀式)逆波兰式是最简单的一种中间代码表示形式,早在编译程序出现之前,它主要用于表示算术表达式,是波兰逻辑学家卢卡西维兹(J.Lukasiewicz)于1929年发明的。后来人们为了纪念他,就把这种后缀表示取名为逆波兰式。逆波兰式最早是用于表示表达式的,后来计算机科学家把它应用于表示程序语言的各种语法成分。,(一)特点,首先我们考察算术表达式(中缀式)的计值顺序.例8.4 中缀式的计值顺序见图8.5。,中缀式计值三个特点:(1)运算对象
17、分别放在运算符(双目运算符)的两边;(2)计值顺序是根据运算符的优先级别及结合性确定,使用括号可以改变计值顺序;(3)运算符的排列顺序不等价于计值顺序。,(1)不考虑运算符的优先关系,又不使用括号;(2)运算符的排列顺序就是计值顺序;(3)运算对象放在运算符的前面。这种表示称为逆波兰式,也称做后缀式。,中缀式虽然是人们习惯的表示,但对于计算机来说,处理起来很不方便,如果我们采用一种表示方法:,如上例:a b(c d(e f)其逆波兰式为:a b c d e f 这种后缀表示法虽然不符合人们的习惯,但它极易被计算机来处理。由于后缀式表示上的简洁和计值的方便,特别适用于解释执行的程序设计语言的中间
18、表示,也方便具有堆栈体系的计算机的目标代码生成。,(二)定义,逆波兰式(后缀式)的一般形式为:若 是一个K元运算符(K 1),它对其运算对象e1,e2,ek作用的结果被表示为:e1 e2 ek,表达式E的后缀表示的递归定义:(1)如果E是变量或常数,那么E的后缀表示是E本身;(2)如果E是形如E1 op E2的表达式,其中op是任意的二元运算符,那么E的后缀表示是E1|E2|op,其中;E1和E2分别是E1和 E2的后缀表示,|称为连接(并置)运算符;(3)如果E是形如(E1),那么E的后缀表示就是E1的后缀表示。,(三)转换(中缀式 后缀式),转换算法:转换规则:设E为给定的中缀式,我们用表
19、示E的后缀式,则有:|;a,其中a表示变量或常数。对于给定的中缀式首先找出最后被计算的运算符,并把此运算符作为上述式中的,使用上述规则转换之;对中缀式的剩余部分重复上述过程,直至中缀式的每个量均被处理到为止。,把一般表达式翻译为后缀式是很容易的。,表8.1给出了把表达式翻译为后缀式的语义规则描述,其中E.code表示E后缀形式,op表示任意二元操作符,“|”表示后缀形式的连接。,解:E T R numprint(8)Rnumprint(8)+Tprint(+)R1numprint(8)+numprint(5)print(+)R1numprint(8)+numprint(5)print(+)Tp
20、rint()R1numprint(8)+numprint(5)print(+)numprint(2)print()R1numprint(8)+numprint(5)print(+)numprint(2)print()输出:print(8)print(5)print(+)print(2)print()即:8 5+2,例8.5 有下面翻译模式:ETRRT print()R1|T print()R1|Tnum print(num.val)把中缀表达式8+5 2翻译成后缀表达式。,后缀式很容易扩充到表达式以外的范围。只要遵守运算对象后直接紧跟它们的运算符的规则即可。赋值语句的后缀表示:如有ab+c,则
21、有 a b c+转向语句GOTO L的后缀表示为“L jump”,运算对象L为语句标号,运算符jump表示转到某个标号。,数组元素A下标表达式1,下标表达式n的后缀表示可表示为:下标表达式1下标表达式2 下标表达式nA subs,运算符Subs表示求数组的下标。当然,这些扩充的后缀表示的计值远比后缀表达式的计值复杂得多,要注意对扩展的运算符的含义正确处理。,条件语句if E then S1 else S2的后缀表示可表示为:E S1 S2¥,把if-then-else看成三目运算符,用¥来表示。,8.2.2 三地址代码,一般形式:x:=y op z如表达式x+y z 翻译成的三地址代码序列是
22、t1:=y z t2:=x+t1 常用的三地址表示:赋值语句 x:=y op z,x:=op y,x:=y无条件转移 goto L条件转移 if x relop y goto L过程调用 param x 和call p,n过程返回 return y索引赋值 x:=yi和 xi:=y地址和指针赋值 x:=&y,x:=y和x:=y,三地址代码有四元式、三元式、间接三元式等形式,三地址代码可看成中间代码的一种抽象形式。编译程序中,三地址代码语句的具体实现可以用记录表示,记录中包含表示运算符和操作数的域。三地址代码通常有三种表示方法:四元式、三元式、间接三元式。,四元式结构形式:(OP,ARG1,AR
23、G2,RESULT),算符,左运算对象,右运算对象,运算结果,三元式结构形式:编号(OP,ARG1,ARG2)间接三元式:由间接三元式序列和间接码表组成。,例8.6 有中缀式a:b*cb*c,求其等价的四元式和三元式。,四元式 三元式 算符 左对象 右对象 结果量 编号 算符 左对象 右对象 op arg1 arg2 result op arg1 arg2 minus c T1(1)minus c b T1 T2(2)b(1)minus c T3(3)minus c b T3 T4(4)b(3)T2 T4 T5(5)(4)(2)T5 a(6)assign a,图8.6 四元式、三元式结构,8.
24、2.3 图形表示,抽象语法树是一种图形化的中间表示,它的每一个叶结点都表示诸如常量或变量这样的运算对象,而它的内部结点则表示运算符;它不同于前述的语法树,它展示了一个操作过程并同时描述了源程序的自然层次结构;DAG(有向无环图)以更紧凑的方式给出了同样的信息(即对于相同的语法成分只给出一次),在图中其结点的含义同抽象语法树。,例:表达式a:=(b+cd)+cd的两种图形表示见图8.8。,抽象语法树是分析树的浓缩表示:算符和关键字是作为内部结点出现的。语法制导翻译可以基于分析树,也可以基于抽象语法树 抽象语法树的例子:,抽象语法树,构造抽象语法树的语法制导定义,图8.10 抽象语法树的语法制导定
25、义例子,例8.8 a+5*b的抽象语法树的构造,E.nptr,T.nptr,E.nptr,T.nptr,F.nptr,id,T.nptr,+,*,F.nptr,F.nptr,id,num,指向符号表中a的入口,指向符号表中b的入口,图8.11(a)a+5*b的抽象语法树,图8.11(b)a+5*b的抽象语法树,T.nptr,图8.11(c)a+5*b的抽象语法树,E.nptr,T.nptr,F.nptr,图8.11(d)a+5*b的抽象语法树,T.nptr,图8.11(e)a+5*b的抽象语法树,指向符号表中b的入口,图8.11(f)a+5*b的抽象语法树,图8.11(g)a+5*b的抽象语法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法 制导 翻译 中间 代码 生成 new
链接地址:https://www.31ppt.com/p-6061425.html