第4讲属性文法精选文档.ppt

上传人:石*** 文档编号:48032908 上传时间:2022-10-04 格式:PPT 页数:61 大小:2.99MB
返回 下载 相关 举报
第4讲属性文法精选文档.ppt_第1页
第1页 / 共61页
第4讲属性文法精选文档.ppt_第2页
第2页 / 共61页
点击查看更多>>
资源描述

《第4讲属性文法精选文档.ppt》由会员分享,可在线阅读,更多相关《第4讲属性文法精选文档.ppt(61页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第4讲属性文法本讲稿第一页,共六十一页1.1.属性文法属性文法 属性文法是在上下文无关文法的基础上为每个文法符属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的号(终结符或非终结符)配备若干个相关的“值值”(称(称为为属性属性)。这些属性代表与文法符号相关的信息,例)。这些属性代表与文法符号相关的信息,例如它的类型、值、代码序列如它的类型、值、代码序列、符号表内容等等。属性、符号表内容等等。属性和变量一样,可以进行计算和传递。和变量一样,可以进行计算和传递。属性一般分为两类:属性一般分为两类:综合属性:综合属性:用于用于“自下而上自下而上”传递信息,传递信息,

2、继承属性:继承属性:用于用于“自上而下自上而下”传递信息。传递信息。属性加工的过程即是属性加工的过程即是语义处理语义处理的过程,对于文法的每的过程,对于文法的每一个产生式都配备了一组属性的计算规则,称为一个产生式都配备了一组属性的计算规则,称为语义规则语义规则。2本讲稿第二页,共六十一页属性的类型 综合属性综合属性:在语法树中,一个结点的综合属性的值由其子结在语法树中,一个结点的综合属性的值由其子结点的属性值确定。通常使用点的属性值确定。通常使用自底向上自底向上的方法在每一个的方法在每一个结点处使用语义规则计算综合属性的值。仅仅使用综合结点处使用语义规则计算综合属性的值。仅仅使用综合属性的属性

3、文法称属性的属性文法称S-S-属性文法。属性文法。继承属性继承属性:在语法树中,一个结点的继承属性由此结点的父在语法树中,一个结点的继承属性由此结点的父结点结点和和/或或兄弟结点的某些属性确定。可用继承属性来表兄弟结点的某些属性确定。可用继承属性来表示程序语言结构中的上下文依赖关系。示程序语言结构中的上下文依赖关系。3本讲稿第三页,共六十一页 注意:注意:(1 1)终结符只有综合属性,由词法分析器提供;)终结符只有综合属性,由词法分析器提供;(2 2)非终结符既可以有综合属性也可以有继承属性。文)非终结符既可以有综合属性也可以有继承属性。文法开始符号的所有继承属性作为属性计算前的初始值。法开始

4、符号的所有继承属性作为属性计算前的初始值。出现在产生式右边的继承属性和出现在产生式左边出现在产生式右边的继承属性和出现在产生式左边的综合属性都必须提供一个计算规则。一般地,属的综合属性都必须提供一个计算规则。一般地,属性计算规则中只能使用相应产生式的文法符号的属性计算规则中只能使用相应产生式的文法符号的属性,这有利于产生式范围内性,这有利于产生式范围内“封装封装”属性的依赖性。属性的依赖性。出现在产生式左边的继承属性和出现在产生式出现在产生式左边的继承属性和出现在产生式右边的综合属性不由所给的产生式的属性计算规右边的综合属性不由所给的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算

5、则进行计算,它们由其它产生式的属性规则计算或由属性计算器的参数提供。或由属性计算器的参数提供。4本讲稿第四页,共六十一页 在一个属性文法中,对应于每个产生式在一个属性文法中,对应于每个产生式A A都有一套都有一套与之相关联的与之相关联的语义规则语义规则,每条语义规则的形式为:,每条语义规则的形式为:b:=f(c b:=f(c1 1,c,c2 2,c,ck k)其中其中f f是一个函数,并且满足是一个函数,并且满足下面两种情况之一:下面两种情况之一:(1 1)b b是是A A的一个综合属性并且的一个综合属性并且c c1 1,c,c2 2,c,ck k是产生式是产生式右边文法符号的属性;右边文法符

6、号的属性;(2 2)b b是产生式右边某个文法符号的一个继承属性并且是产生式右边某个文法符号的一个继承属性并且c c1 1,c,c2 2,c,ck k是是A A或产生式右边任何文法符号的属性。或产生式右边任何文法符号的属性。对这两种情况都称为属性对这两种情况都称为属性b b依赖于依赖于属性属性c c1 1,c,c2 2,c,ck k5本讲稿第五页,共六十一页语义规则语义规则 描述属性计算、静态语义检查、符号表描述属性计算、静态语义检查、符号表操作、代码生成等。语义规则可能产生操作、代码生成等。语义规则可能产生副作副作用用(如产生代码),也可能不是变元的严格(如产生代码),也可能不是变元的严格函

7、数(即函数中还有其它没有列出的自变量函数(即函数中还有其它没有列出的自变量如变量地址等),比如说某个规则可能给出如变量地址等),比如说某个规则可能给出可用的下一个数据单元的地址。这样的语义可用的下一个数据单元的地址。这样的语义规则通常写成过程调用或过程段。规则通常写成过程调用或过程段。6本讲稿第六页,共六十一页 下表是一个台式计算器程序的属性文法。该计算器读入一个算术下表是一个台式计算器程序的属性文法。该计算器读入一个算术表达式,计算并打印它的值,每个输入行以表达式,计算并打印它的值,每个输入行以n n作为结束。作为结束。在这些语义规则中,一个整数综合属性在这些语义规则中,一个整数综合属性va

8、lval把每个非终结符把每个非终结符E,T,FE,T,F联联系起来。记号系起来。记号digitdigit具有综合属性具有综合属性lexvallexval,其值由词法分析器提供。,其值由词法分析器提供。产生式语义规则LE nPrint(E.val)EE1+TE.val:=E1.val+T.valETE.val:=T.valTT1*FT.val:=T1.valF.valTFT.val:=F.valF(E)F.val:=E.valFdigitF.val:=digit.lexval7本讲稿第七页,共六十一页LnE.val=19E.val=15T.val=4T.val=15F.val=4T.val=3F

9、.val=5digit.lexval=4F.val=3digit.lexval=5digit.lexval=3+*句子句子3*5+43*5+4n n的带注释的语法树的带注释的语法树这是个带综合属性文法的例子,下面再来看一个继承这是个带综合属性文法的例子,下面再来看一个继承属性的例子。属性的例子。8本讲稿第八页,共六十一页产生式语义规则D T LL.in:=T.typeT intT.type:=integerT realT.type:=realL L1,idL1.in:=L.in addtype(id.entry,L.in)L idaddtype(id.entry,L.in)变量声明语句中,通过

10、继承属性把类型信息传递变量声明语句中,通过继承属性把类型信息传递给每个标识符。给每个标识符。问题:给出句子问题:给出句子real a,b,c 的带注释的语法树的带注释的语法树?9本讲稿第九页,共六十一页10本讲稿第十页,共六十一页2.2.基于属性文法的处理方法基于属性文法的处理方法 对单词符号串进行语法分析,构造语法分析树,然后对单词符号串进行语法分析,构造语法分析树,然后根据需要遍历语法树,并在语法树的各结点处按语义规则根据需要遍历语法树,并在语法树的各结点处按语义规则进行计算。进行计算。输入串输入串语法树语法树依赖图依赖图语义规则计算次序语义规则计算次序 这种由源程序的语法结构所驱动的处理

11、办法就是这种由源程序的语法结构所驱动的处理办法就是语法语法制导翻译制导翻译。语义规则的计算可能语义规则的计算可能产生代码产生代码、在、在符号表符号表中存放信中存放信息、给出息、给出错误信息错误信息或执行任何或执行任何其它动作其它动作。对输入串的翻译对输入串的翻译=根据语义规则进行计算得出结果根据语义规则进行计算得出结果11本讲稿第十一页,共六十一页依赖图依赖图 语法树中结点属性之间的相互依赖关系用语法树中结点属性之间的相互依赖关系用依赖图依赖图描述描述 为每一个包含过程调用的语义规则引入一为每一个包含过程调用的语义规则引入一个个虚综合属性虚综合属性b b,这样把每一个语义规则都写,这样把每一个

12、语义规则都写成成 b:=f(c b:=f(c1 1,c,c2 2,c ck k)的形式。的形式。依赖图是一个有向图,为每一个属性设置依赖图是一个有向图,为每一个属性设置一个结点:如果属性一个结点:如果属性b b依赖属性依赖属性c c,则从属性,则从属性c c的结点有一条有向边连到属性的结点有一条有向边连到属性b b的结点。的结点。12本讲稿第十二页,共六十一页依赖图依赖图的画法的画法 例:属性例:属性 A.a:=f(X.x,Y.y)A.a:=f(X.x,Y.y)对应于产生式对应于产生式 A AXY XY 的语义规则。的语义规则。在依赖图中有三个相关结点:在依赖图中有三个相关结点:A.a,X.x

13、,Y.y A.a,X.x,Y.y。由于由于A.aA.a依赖于依赖于X.xX.x,Y.y Y.y,所以有,所以有两条有向边从两条有向边从X.xX.x到到A.aA.a,从,从Y.yY.y连到连到A.a.A.a.如果与产生式如果与产生式A AXYXY对应的语义规则还对应的语义规则还有:有:X.i:=g(A.a,Y.y)X.i:=g(A.a,Y.y)图中再增加两条有向边:从图中再增加两条有向边:从A.aA.a连到连到X.iX.i,从,从Y.yY.y连到连到X.i,X.i,因为因为X.iX.i依赖于依赖于A.aA.a和和Y.y.Y.y.13本讲稿第十三页,共六十一页例依赖图当下面的产生式应用于语法树时,

14、我们就像下当下面的产生式应用于语法树时,我们就像下图所示的那样把有向边加到依赖图中。图所示的那样把有向边加到依赖图中。产生式产生式 语义规则语义规则 EE1+E2 E.val:=E1.val+E2.val14本讲稿第十四页,共六十一页例依赖图因为产生式因为产生式因为产生式因为产生式D D D DTLTLTLTL的语义规的语义规的语义规的语义规则则则则L.in=T.type,L.in=T.type,L.in=T.type,L.in=T.type,从代从代从代从代表表表表T.typeT.typeT.typeT.type的结点的结点的结点的结点4 4 4 4有一有一有一有一条边连到代表条边连到代表条

15、边连到代表条边连到代表L.inL.inL.inL.in的的的的结点结点结点结点5 5 5 5;因为产生式因为产生式因为产生式因为产生式L L L LL1,idL1,idL1,idL1,id有语有语有语有语义规则义规则义规则义规则L1.in=L.in,L1.in=L.in,L1.in=L.in,L1.in=L.in,可可可可知知知知L1.inL1.inL1.inL1.in依赖于依赖于依赖于依赖于L.in,L.in,L.in,L.in,所所以有两条向下的边分别以有两条向下的边分别进入结点进入结点7 7 和和9 9。每一个与每一个与L L产生式有关的语义规则产生式有关的语义规则addtype(id.

16、entry,L.in)addtype(id.entry,L.in)都产生一个都产生一个虚属性,结点虚属性,结点6 6、8 8和和1010都是为这些虚属性构造的。都是为这些虚属性构造的。15本讲稿第十五页,共六十一页良定义文法和属性的计算次序良定义文法和属性的计算次序 定义:属性之间定义:属性之间不存在循环依赖关系不存在循环依赖关系的属性文法。的属性文法。一个有向非循环图的一个有向非循环图的拓扑序拓扑序是图中结点的任何顺序是图中结点的任何顺序m1,m2,mk,使得边必须是从序列中前面的结点指向后面使得边必须是从序列中前面的结点指向后面的结点。也就是说,如果的结点。也就是说,如果mimj是是mi到

17、到mj的一条边,那么的一条边,那么在序列中在序列中mi必须出现在必须出现在mj之前。之前。一个依赖图的任何拓扑排序都给出一个语法树中结点的一个依赖图的任何拓扑排序都给出一个语法树中结点的语义规则计算的有效顺序。语义规则计算的有效顺序。属性文法说明的翻译是很精确的:基础文法用于构造输属性文法说明的翻译是很精确的:基础文法用于构造输入符号串的语法分析树,在此基础之上可以建立依赖图。入符号串的语法分析树,在此基础之上可以建立依赖图。按照图的某一种拓扑排序,就可以根据语义规则进行翻译。按照图的某一种拓扑排序,就可以根据语义规则进行翻译。16本讲稿第十六页,共六十一页树遍历的属性计算方法树遍历的属性计算

18、方法 以某种次序遍历语法树,直至计算出所有的以某种次序遍历语法树,直至计算出所有的属性。最常用的遍历方法是属性。最常用的遍历方法是深度优先,从左深度优先,从左到右到右的遍历方法。这种方法最简单,适应面的遍历方法。这种方法最简单,适应面最广。(算法略)最广。(算法略)缺点:缺点:v必须在语法树建立之后才能使用必须在语法树建立之后才能使用v效率不高效率不高对每个非终结符号:对每个非终结符号:多次重复计算所有能够计算的继承属性多次重复计算所有能够计算的继承属性最后计算所有能够计算的综合属性最后计算所有能够计算的综合属性17本讲稿第十七页,共六十一页一遍扫描的处理方法一遍扫描的处理方法 在语法分析的同

19、时计算属性值,因而无需构造实际在语法分析的同时计算属性值,因而无需构造实际的语法树。的语法树。语法制导翻译法就是为文法中每个产生式配上一组语法制导翻译法就是为文法中每个产生式配上一组语义规则,并且,在语义规则,并且,在语法分析的同时语法分析的同时执行这些语义规执行这些语义规则。则。计算语义规则,完成有关语义分析和代码生成动作的时机:计算语义规则,完成有关语义分析和代码生成动作的时机:自上而下分析中一个产生式匹配输入串成功时;自上而下分析中一个产生式匹配输入串成功时;自下而上分析中一个产生式被用于进行归约时。自下而上分析中一个产生式被用于进行归约时。18本讲稿第十八页,共六十一页抽象语法树抽象语

20、法树v 在语法分析期间完成翻译工作可大幅提高编译的时空效率,在语法分析期间完成翻译工作可大幅提高编译的时空效率,但也存在一些问题:但也存在一些问题:适合于语法分析的文法可能并不反映语言成分的自然层次结适合于语法分析的文法可能并不反映语言成分的自然层次结构;构;特定的语法分析方法也可能限制了语法分析树的节点考察顺特定的语法分析方法也可能限制了语法分析树的节点考察顺序序v 因此,现代编译器通用的做法是:通过语法分析构造语因此,现代编译器通用的做法是:通过语法分析构造语法树,再对语法树进行遍历完成属性的计算。也就是使用法树,再对语法树进行遍历完成属性的计算。也就是使用中间表示中间表示(Interme

21、diate Representation)(Intermediate Representation)把翻译从语法把翻译从语法分析中分离出来。分析中分离出来。v这样做可以使编译器更好地模块化,也方便了移植和优化。这样做可以使编译器更好地模块化,也方便了移植和优化。19本讲稿第十九页,共六十一页 为每个运算分量或运算符为每个运算分量或运算符号都建立一个结点来为子号都建立一个结点来为子表达式建立子树。运算符表达式建立子树。运算符号结点的各子结点分别是号结点的各子结点分别是表示该运算符号的各个运表示该运算符号的各个运算分量的子表达式组成的算分量的子表达式组成的子树的根。子树的根。抽象语法树中的每一个结

22、点可以由包抽象语法树中的每一个结点可以由包含几个域的记录来实现。含几个域的记录来实现。在一个运算符在一个运算符号对应的结点中号对应的结点中,一个域标识运算符号一个域标识运算符号,其它域包含指向运算分量的结点的指针。其它域包含指向运算分量的结点的指针。通常,运算符号叫做这个结点的标号。通常,运算符号叫做这个结点的标号。进行翻译时,抽象语法树中的结点可能进行翻译时,抽象语法树中的结点可能会用附加域来存放结点的属性值会用附加域来存放结点的属性值(或指向或指向属性的指针)。属性的指针)。表达式表达式3*5+4的抽象语法树的抽象语法树抽象语法树抽象语法树(AST)(AST):语法分析树的压缩形式。:语法

23、分析树的压缩形式。叶子结点:终结符的综合属性、文法开始符号的继承属性叶子结点:终结符的综合属性、文法开始符号的继承属性以下以表达式为例,说明如何构造以下以表达式为例,说明如何构造ASTAST。20本讲稿第二十页,共六十一页产生式语义规则EE1+TE.nptr:=mknode(+,E1.nptr+T.nptr)ETE.nptr:=T.nptrTT1*FT.nptr:=mknode(*,T1.nptr+F.nptr)TFT.nptr:=F.nptrF(E)F.nptr:=E.nptrFidF.nptr:=mkleaf(id,id.entry)Fnumber F.nptr:=mkleaf(numbe

24、r,number.val)综合属性综合属性nptr表示函数调用返回的指针。表示函数调用返回的指针。21本讲稿第二十一页,共六十一页a+5*b的语法树的构造的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中指向符号表中a的入口的入口指向符号表中指向符号表中b的入口的入口22本讲稿第二十二页,共六十一页a+5*b的语法树的构造的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中指向符号表

25、中a的入口的入口指向符号表中指向符号表中b的入口的入口23本讲稿第二十三页,共六十一页a+5*b的语法树的构造的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中指向符号表中a的入口的入口指向符号表中指向符号表中b的入口的入口24本讲稿第二十四页,共六十一页a+5*b的语法树的构造的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中指向符号表中a的入口的入口指向符号表中指向符号表中b的

26、入口的入口25本讲稿第二十五页,共六十一页a+5*b的语法树的构造的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中指向符号表中a的入口的入口指向符号表中指向符号表中b的入口的入口26本讲稿第二十六页,共六十一页a+5*b的语法树的构造的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中指向符号表中a的入口的入口指向符号表中指向符号表中b的入口的入口27本讲稿第二十七页,共六十一页a

27、+5*b的语法树的构造的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中指向符号表中a的入口的入口指向符号表中指向符号表中b的入口的入口28本讲稿第二十八页,共六十一页a+5*b的语法树的构造的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中指向符号表中a的入口的入口指向符号表中指向符号表中b的入口的入口29本讲稿第二十九页,共六十一页a+5*b的语法树的构造的语法树的构造E.np

28、trT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中指向符号表中a的入口的入口指向符号表中指向符号表中b的入口的入口30本讲稿第三十页,共六十一页3.3.S-属性文法的自下而上计算S-属性文法:只含有综合属性的属性文法。属性文法:只含有综合属性的属性文法。在自底向上的分析法如在自底向上的分析法如LR分析法中,我们使用分析法中,我们使用一个栈来存放已经分析过的子树的信息,现在一个栈来存放已经分析过的子树的信息,现在可以在分析栈中使用一个附加的域来存放综合可以在分析栈中使用一个附加的域来存放综合属性值。属性值。如果

29、一个属性文法是如果一个属性文法是S-属性文法,那么在属性文法,那么在计算每个语义规则时,分析栈中栈顶处正计算每个语义规则时,分析栈中栈顶处正好就是计算语义规则时需要用到的其它属好就是计算语义规则时需要用到的其它属性值。性值。31本讲稿第三十一页,共六十一页 假设图中的栈是由一对数组假设图中的栈是由一对数组state和和val来实现的。每一个来实现的。每一个state元素都是一元素都是一个指向个指向LR(1)分析表的指针(或索引)。(注意,文法符号隐含在分析表的指针(或索引)。(注意,文法符号隐含在state中而不需中而不需要存储在栈中)。然而,如果像第五章中的那样把文法符号存入栈中时,那么当要

30、存储在栈中)。然而,如果像第五章中的那样把文法符号存入栈中时,那么当第第i个个state对应的符号为对应的符号为A时,时,vali中就存放语法树中与结点中就存放语法树中与结点A对应的属性值。对应的属性值。设当前栈顶由指针设当前栈顶由指针top指示。我们假设综合属性是刚好在每次归约前计算的。假设语指示。我们假设综合属性是刚好在每次归约前计算的。假设语义规则义规则A.a:=f(X.x,Y.y,Z.z)是对应于产生式是对应于产生式AXYZ的。在把的。在把XYZ归约成归约成A以前,属性以前,属性Z.z的值放在的值放在valtop中,中,Y.y的值放在的值放在valtop-1中,中,X.x的值放在的值放

31、在valtop-2中。如果中。如果一个符号没有综合属性,那么数组一个符号没有综合属性,那么数组val中相应的元素就不定义。归约后,中相应的元素就不定义。归约后,top值减值减2,A的状态存放在的状态存放在statetop中(也就是中(也就是X的位置)综合属性的位置)综合属性A.a的值存放在的值存放在valtop中。中。State State State State val val val val X X X X X.x X.x X.x X.xY Y Y Y Y.yY.yY.yY.yZ Z Z Z栈顶栈顶栈顶栈顶Z.zZ.zZ.zZ.z val val val val X.x X.x X.x X

32、.x Y.yY.yY.yY.y栈顶栈顶栈顶栈顶Z.zZ.zZ.zZ.z 简化为简化为简化为简化为32本讲稿第三十二页,共六十一页边分析边翻译的方式能否用于继承属性边分析边翻译的方式能否用于继承属性?v属性的计算次序一定受分析方法所限定的分析树结点属性的计算次序一定受分析方法所限定的分析树结点建立次序的限制建立次序的限制v分析树的结点是自左向右生成分析树的结点是自左向右生成v如果属性信息是自左向右流动,那么就有可能在分析如果属性信息是自左向右流动,那么就有可能在分析的同时完成属性计算的同时完成属性计算33本讲稿第三十三页,共六十一页4.4.L-L-属性文法和自顶向下翻译属性文法和自顶向下翻译L-

33、属性文法属性文法:如果对于每个产生式:如果对于每个产生式AX1X2Xn的每个语义的每个语义规则中,每个属性或者是综合属性,或者是规则中,每个属性或者是综合属性,或者是Xj(1=j=n)的一的一个继承属性且这个继承属性仅依赖于:个继承属性且这个继承属性仅依赖于:(1)产生式)产生式Xj的左边符号的左边符号X1,X2,Xj-1的属性的属性 (2)A的继承属性。的继承属性。L-属性文法也就是属性文法也就是“左属性左属性”文法,计算每一个继承属性文法,计算每一个继承属性时不能引用右边符号的属性时不能引用右边符号的属性(继承属性和综合属性继承属性和综合属性)。由。由此定义可知,此定义可知,S属性文法一定

34、是属性文法一定是L属性文法。属性文法。34本讲稿第三十四页,共六十一页 翻译模式翻译模式 属性文法可以看成是关于语言翻译的高级规范说明,属性文法可以看成是关于语言翻译的高级规范说明,其中隐去实现细节,使用户从明确说明翻译顺序的工作中其中隐去实现细节,使用户从明确说明翻译顺序的工作中解脱出来。下面我们讨论一种适合语法制导翻译的另一种解脱出来。下面我们讨论一种适合语法制导翻译的另一种描述形式,称为描述形式,称为翻译模式翻译模式。翻译模式给出了使用语义规则。翻译模式给出了使用语义规则进行计算的次序,这样就可以把某些实现细节表示出来。进行计算的次序,这样就可以把某些实现细节表示出来。在翻译模式中,和文

35、法符号相关的属性和语义规则(这里在翻译模式中,和文法符号相关的属性和语义规则(这里我们也称语义动作),用花括号我们也称语义动作),用花括号 括起来,插入到产生括起来,插入到产生式右部的合适位置上。这样翻译模式给出了使用语义规则式右部的合适位置上。这样翻译模式给出了使用语义规则进行计算的顺序。进行计算的顺序。35本讲稿第三十五页,共六十一页对继承属性出现位置的限制对继承属性出现位置的限制为了计算出继承属性,为了计算出继承属性,翻译模式翻译模式必须满足三个条件:必须满足三个条件:(1)产生式右边的符号的继承属性必须在这个符号以前)产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来。的动作

36、中计算出来。(2)一个动作不能引用这个动作右边符号的综合属性。)一个动作不能引用这个动作右边符号的综合属性。(3)产生式左边非终结符的综合属性只有在它所引用的所)产生式左边非终结符的综合属性只有在它所引用的所有属性都计算出来后才能计算。计算这种属性的动作通常有属性都计算出来后才能计算。计算这种属性的动作通常可放在产生式右端的末尾。可放在产生式右端的末尾。36本讲稿第三十六页,共六十一页不满足条件的例子SA1A2 A1.in:=1;A2.in:=2;A a print(A.in)应该改为:S A1.in:=1;A1 A2.in:=2;A2 A a print(A.in)通常写成:S A1.in:

37、=1;A1 A2.in:=2;A2 A a print(A.in)37本讲稿第三十七页,共六十一页自顶向下翻译自顶向下翻译 在第四章我们知道,为了构造不带回溯的在第四章我们知道,为了构造不带回溯的自顶向下语法分析,必须消除文法中的左递自顶向下语法分析,必须消除文法中的左递归。现在我们把前面消除左递归的方法加以归。现在我们把前面消除左递归的方法加以扩充扩充,当消除一个翻译模式的基本语法的左递当消除一个翻译模式的基本语法的左递归时同时考虑属性。这种方法适合带综合属归时同时考虑属性。这种方法适合带综合属性的翻译模式。这样许多文法可以使用自顶性的翻译模式。这样许多文法可以使用自顶向下分析来实现。向下分

38、析来实现。38本讲稿第三十八页,共六十一页消除左递归消除左递归推广转换左递规翻译模式的方法,以便进行自顶向下分析:推广转换左递规翻译模式的方法,以便进行自顶向下分析:假设我们有下面的翻译模式:假设我们有下面的翻译模式:AA1Y A.a:=g(A1.a,Y.y)AX A.a:=f(X.x)其每个文法符号都有一个综合属性,用小写字母表示,其每个文法符号都有一个综合属性,用小写字母表示,g和和f是任是任意函数。意函数。利用第四章消除左递归的算法,可将其转换成下面文法:利用第四章消除左递归的算法,可将其转换成下面文法:AXR R YR|39本讲稿第三十九页,共六十一页 翻译模式变为:翻译模式变为:AX

39、 R.i:=f(X.x)AX R.i:=f(X.x)R A.a:=R.s R A.a:=R.s RY R RY R1 1.i:=g(R.i,Y.y).i:=g(R.i,Y.y)R R1 1 R.s:=R R.s:=R1 1.s .s R R.s:=R.i R R.s:=R.i 经过转换的翻译模式,使用了经过转换的翻译模式,使用了R R的继承属性的继承属性i i和综合属和综合属性性s.s.考虑产生算术表达式的文法,它的翻译模式如何考虑产生算术表达式的文法,它的翻译模式如何?考虑语义动作考虑语义动作40本讲稿第四十页,共六十一页 求值翻译模式:求值翻译模式:使用属性使用属性valval来保存计算结

40、果来保存计算结果 ET R.i:=T.val ET R.i:=T.val R E.val:=R.s R E.val:=R.s R+R+T R T R1 1.i:=R.i+T.val.i:=R.i+T.val R R1 1 R.s:=R R.s:=R1 1.s .s R R.s:=R.i R R.s:=R.i T(T(E E )T.val:=E.val )T.val:=E.val Tnum T.val:=num.val Tnum T.val:=num.val41本讲稿第四十一页,共六十一页 构造语法树的翻译模式:构造语法树的翻译模式:使用属性使用属性p p来保存语法子树的根结点指针来保存语法子树

41、的根结点指针 ET R.i:=T.p ET R.i:=T.p R E.p:=R.s R E.p:=R.s R+R+T R T R1 1.i:=mknod(+,R.i,T.p).i:=mknod(+,R.i,T.p)R R1 1 R.s:=R R.s:=R1 1.s .s R R.s:=R.i R R.s:=R.i T(T(E E )T.p:=E.p )T.p:=E.p Tnum T.p:=mkleaf(num,num.val)Tnum T.p:=mkleaf(num,num.val)42本讲稿第四十二页,共六十一页递归下降翻译器的构造递归下降翻译器的构造v思想:对递归下降的语法分析器进行扩展(

42、在适当的位置加入语义子程序),使之能够实现翻译模式。v方法:为每个非终结符A构造一个函数,A的继承属性对应该函数的形式参数,其返回值为A的综合属性。函数体内,对出现在A的产生式右部的每个文法符号的每个属性都设置一个局部变量。控制流程依然由递归下降分析方法确定。43本讲稿第四十三页,共六十一页在每个产生式对应的程序代码中,按照从左到右的次序,对于终结符、非终结符及其语义动作分别作以下工作:v对于带有综合属性x的终结符X,把x的值存入为X.x设置的变量中。然后产生一个匹配X的调用,并继续输入。v对于每个非终结符B,产生一个右部带有函数调用的赋值语句 c=B(b1,b2,.,bn),其中b1,b2,

43、.,bn是为B的继承属性设置的变量,c是为B的综合属性设置的变量。v对于语义动作,把动作的代码抄进语法分析器中,并把对属性的引用改为对相应变量的引用。思考:实现上述算术表达式文法的翻译模式,产生语法树。44本讲稿第四十四页,共六十一页 预测翻译器的设计:示例预测翻译器的设计:示例把预测分析器的构造方法推广到翻译方案的实现把预测分析器的构造方法推广到翻译方案的实现产生式产生式R +TR|的分析过程的分析过程procedure R;beginif lookahead=+then beginmatch(+);T;Rendelse begin /什么也不做什么也不做 /endend 45本讲稿第四十五

44、页,共六十一页function R(i:syntax_tree_node):syntax_tree_node;var nptr,i1,s1,s:syntax_tree_node;addoplexeme:char;begin if lookahead=+then begin /产产生式生式 R +T R /addoplexeme=lexval;match(+);nptr=T;i1=mknode(addoplexme,i,nptr);s1=R(i1);s =s1endelse s=i;/产产生式生式 R /return send;R:i,sT:nptr+:addoplexeme46本讲稿第四十六页

45、,共六十一页 5.5.自下而上计算继承属性自下而上计算继承属性v自下而上地计算L-属性。可以基于所有LL(1)文法和许多LR(1)的L-属性文法。1.从翻译模式中去掉嵌入在产生式中间的动作2.分析栈中的继承属性 复写规则:能够预知属性值在栈中的存放位置3.模拟继承属性的计算 不能预知属性值在栈中的存放位置时,通过模拟非终结符、修改翻译模式归结为2中的情形4.用综合属性代替继承属性 改变基础文法以避免继承属性 详见参考书详见参考书47本讲稿第四十七页,共六十一页习题一v下列文法由开始符号S产生一个二进制数,令综合属性val给出该数的值:SL.L|LL LB|BB 0|1 试设计求S.val的属性

46、文法。其中,已知B的综合属性c给出由B产生的二进位的结果值。48本讲稿第四十八页,共六十一页方法1:使用L.val、L.len属性SL S.val=L.val SL1.L2 S.val=L1.val+L2.val/2L2.lenL BL.val=B.c,L.len=1L L1BL.val=2*L1.val+B.c,L.len=L.len+1B 0B.c=0B 1B.c=149本讲稿第四十九页,共六十一页方法2:使用L.lval、L.w属性SL S.val=L.lval SL1.L2 S.val=L1.lval+L2.lval/L2.wL BL.lval=B.c,L.w=2L L1BL.lval

47、=2*L1.lval+B.c,L.w=2*L1.w B 0B.c=0B 1B.c=150本讲稿第五十页,共六十一页为下面文法写一个语法制导的定义,用为下面文法写一个语法制导的定义,用S S的综合属性的综合属性valval给出下面文法中给出下面文法中S S产生的二进制数的值。例如,输入产生的二进制数的值。例如,输入101.101101.101时时,S.S.valval =5.6255.625。不不得得修修改改文文法法,但但属属性性使使用用没有限制没有限制S L.R|LL L B|BR B R|BB 0|1S.LLBLBBRRBRBB习题二51本讲稿第五十一页,共六十一页S L.RS.val=L.

48、val+R.valS LS.val=L.valL L1 BL.val=L1.val 2+B.valL BL.val=B.valR B R1R.val=R1.val/2+B.val/2R BR.val=B.val/2B 0B.val=0B 1B.val=152本讲稿第五十二页,共六十一页给出把中缀表达式翻译成没有冗余括号的中缀表给出把中缀表达式翻译成没有冗余括号的中缀表达式的语法制导定义。例如达式的语法制导定义。例如,因为因为 和和 是左结合是左结合,(a (b+c)(d)可可以以重重写写成成a (b+c)dv先先把把表表达达式式的的括括号号都都去去掉掉,然然后后在在必必要要的的地地方方再加括号

49、再加括号v去掉表达式中的冗余括号,保留必要的括号去掉表达式中的冗余括号,保留必要的括号 习题三53本讲稿第五十三页,共六十一页 第一种方法第一种方法S E print(E.code)E E1+T if T.op=plus thenE.code=E1.code|“+”|“(”|T.code|“)”elseE.code=E1.code|“+”|T.code;E.op=plusE TE.code=T.code;E.op=T.op54本讲稿第五十四页,共六十一页T T1 Fif(F.op=plus)or(F.op=times)thenif T1.op=plus thenT.code=“(”|T1.co

50、de|“)”|“”|“(”|F.code|“)”elseT.code=T1.code|“”|“(”|F.code|“)”else if T1.op=plus thenT.code=“(”|T1.code|“)”|“”|F.codeelseT.code=T1.code|“”|F.code;T.op=times55本讲稿第五十五页,共六十一页T FT.code=F.code;T.op=F.opF idF.code=id.lexeme;F.op=idF (E)F.code=E.code;F.op=E.op56本讲稿第五十六页,共六十一页 第二种方法第二种方法v给给E,T和和F两个继承属性两个继承属性

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁