




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、11. 1. 属性文法 属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。这些属性代表与文法符号相关的信息,例如它的类型、值、代码序列 、符号表内容等等。属性和变量一样,可以进行计算和传递。 属性一般分为两类:综合属性:用于“自下而上”传递信息,继承属性:用于“自上而下”传递信息。 属性加工的过程即是语义处理的过程,对于文法的每一个产生式都配备了一组属性的计算规则,称为语义规则。第1页/共62页2属性的类型 综合属性: 在语法树中,一个结点的综合属性的值由其子结点的属性值确定。通常使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值
2、。仅仅使用综合属性的属性文法称S-S-属性文法。 继承属性: 在语法树中,一个结点的继承属性由此结点的父结点和/ /或兄弟结点的某些属性确定。可用继承属性来表示程序语言结构中的上下文依赖关系。第2页/共62页3 注意:(1 1)终结符只有综合属性,由词法分析器提供;(2 2)非终结符既可以有综合属性也可以有继承属性。文法开始符号的所有继承属性作为属性计算前的初始值。出现在产生式右边的继承属性和出现在产生式左边的综合属性都必须提供一个计算规则。一般地,属性计算规则中只能使用相应产生式的文法符号的属性,这有利于产生式范围内“封装”属性的依赖性。出现在产生式左边的继承属性和出现在产生式右边的综合属性
3、不由所给的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算或由属性计算器的参数提供。第3页/共62页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是产生式右边文法符号的属性; (2 2)b b是产生式右边某个文法符号的一个继承属性并且c c1 1,c,c2 2,c,ck k是A A或产生式右边任何文法符号的属性。 对这两种情况都称为属
4、性b b依赖于属性c c1 1,c,c2 2, , c, , ck k。第4页/共62页5语义规则 描述属性计算、静态语义检查、符号表操作、代码生成等。语义规则可能产生副作用(如产生代码),也可能不是变元的严格函数(即函数中还有其它没有列出的自变量如变量地址等),比如说某个规则可能给出可用的下一个数据单元的地址。这样的语义规则通常写成过程调用或过程段。第5页/共62页6 下表是一个台式计算器程序的属性文法。该计算器读入一个算术表达式,计算并打印它的值,每个输入行以n n作为结束。 在这些语义规则中,一个整数综合属性valval把每个非终结符E,T,FE,T,F联系起来。记号digitdigit
5、具有综合属性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.lexval第6页/共62页7LnE.val=19E.val=15T.val=4T.val=15F.val=4T.val=3F.val=5digit.lexval=4F.val=3digit.lexval=5digit.lexval=3+*句子3*5+4n的带注释的语法树这
6、是个带综合属性文法的例子,下面再来看一个继承属性的例子。第7页/共62页8产生式产生式语义规则语义规则D D T L T LL.in:=T.typeL.in:=T.typeT T intintT.type:= T.type:= integerintegerT T realrealT.type:= T.type:= realrealL L L L1 1 ,id,idL L1 1.in:=L.in .in:=L.in addtype(addtype(id.entryid.entry,L.in),L.in)L L ididaddtype(addtype(id.entryid.entry,L.in),
7、L.in)变量声明语句中,通过继承属性把类型信息传递给每个标识符。问题:给出句子real a,b,c 的带注释的语法树?第8页/共62页9第9页/共62页102. 2. 基于属性文法的处理方法 对单词符号串进行语法分析,构造语法分析树,然后根据需要遍历语法树,并在语法树的各结点处按语义规则进行计算。 输入串语法树依赖图按次序计算语义规则 这种由源程序的语法结构所驱动的处理办法就是语法制导翻译。 语义规则的计算可能产生代码、在符号表中存放信息、给出错误信息或执行任何其它动作。对输入串的翻译=根据语义规则进行计算得出结果第10页/共62页11依赖图 语法树中结点属性之间的相互依赖关系用依赖图描述
8、为每一个包含过程调用的语义规则引入一个虚综合属性b b,这样把每一个语义规则都写成 b:= f(c b:= f(c1 1,c,c2 2, , c ck k) ) 的形式。 依赖图是一个有向图,为每一个属性设置一个结点:如果属性b b依赖属性c c,则从属性c c的结点有一条有向边连到属性b b的结点。第11页/共62页12依赖图的画法 例:属性 A.a:=f( X.x, Y.y )A.a:=f( X.x, Y.y ) 对应于产生式 A AXY XY 的语义规则。 在依赖图中有三个相关结点: A.a,X.x,Y.yA.a,X.x,Y.y。 由于A.aA.a依赖于X.xX.x, Y.yY.y,所以
9、有两条有向边从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.第12页/共62页13例依赖图当下面的产生式应用于语法树时,我们就像下图所示的那样把有向边加到依赖图中。 产生式 语义规则 EE1+E2 E.val:=E1.val+E2.val第13页/共62页14所以有两条向下的边分别进入结点7 7 和9 9。每一个与L产生式有关的语
10、义规则addtype(id.entry,L.in)都产生一个虚属性,结点6、8和10都是为这些虚属性构造的。第14页/共62页15良定义文法和属性的计算次序 定义:属性之间不存在循环依赖关系的属性文法。 一个有向非循环图的拓扑序是图中结点的任何顺序m1,m2, mk,使得边必须是从序列中前面的结点指向后面的结点。也就是说,如果mimj是mi到mj的一条边,那么在序列中mi必须出现在mj之前。 一个依赖图的任何拓扑排序都给出一个语法一个依赖图的任何拓扑排序都给出一个语法树中结点的语义规则计算的有效顺序。树中结点的语义规则计算的有效顺序。 属性文法说明的翻译是很精确的:基础文法用于构造输入符号串的
11、语法分析树,在此基础之上可以建立依赖图。按照图的某一种拓扑排序,就可以根据语义规则进行翻译。第15页/共62页16树遍历的属性计算方法 以某种次序遍历语法树,直至计算出所有的属性。最常用的遍历方法是深度优先,从左到右的遍历方法。这种方法最简单,适应面最广。(算法略) 缺点: 必须在语法树建立之后才能使用 效率不高对每个非终结符号:多次重复计算所有能够计算的继承属性最后计算所有能够计算的综合属性第16页/共62页17一遍扫描的处理方法 在语法分析的同时计算属性值,因而无需构造实际的语法树。 语法制导翻译法就是为文法中每个产生式配上一组语义规则,并且,在语法分析的同时执行这些语义规则。计算语义规则
12、,完成有关语义分析和代码生成动作的时机:自上而下分析中一个产生式匹配输入串成功时;自下而上分析中一个产生式被用于进行归约时。第17页/共62页18抽象语法树 在语法分析期间完成翻译工作可大幅提高编译的时空效率,但也存在一些问题: 适合于语法分析的文法可能并不反映语言成分的自然层次结构; 特定的语法分析方法也可能限制了语法分析树的节点考察顺序 因此,现代编译器通用的做法是:通过语法分析构造语法树,再对语法树进行遍历完成属性的计算。也就是使用中间表示(Intermediate (Intermediate Representation)Representation)把翻译从语法分析中分离出来。 这样
13、做可以使编译器更好地模块化,也方便了移植和优化。第18页/共62页19 为每个运算分量或运算符号都建立一个结点来为子表达式建立子树。运算符号结点的各子结点分别是表示该运算符号的各个运算分量的子表达式组成的子树的根。 抽象语法树中的每一个结点可以由包含几个域的记录来实现。 在一个运算符号对应的结点中,一个域标识运算符号,其它域包含指向运算分量的结点的指针。 通常,运算符号叫做这个结点的标号。进行翻译时,抽象语法树中的结点可能会用附加域来存放结点的属性值(或指向属性的指针)。表达式3*5+4的抽象语法树抽象语法树(AST):语法分析树的压缩形式。叶子结点:终结符的综合属性、文法开始符号的继承属性以
14、下以表达式为例,说明如何构造AST。第19页/共62页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(number,number.val)综合属性nptr表示函数调用返回的指针。第20页/共62页21a+5* *b的语法树的构造E.nptrT.nptrE.nptrT.nptr
15、F.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中a的入口指向符号表中b的入口第21页/共62页22a+5* *b的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中a的入口指向符号表中b的入口第22页/共62页23a+5* *b的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中a的入口指向符号表中b的入口第23页/共62页24a+5*
16、*b的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中a的入口指向符号表中b的入口第24页/共62页25a+5* *b的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中a的入口指向符号表中b的入口第25页/共62页26a+5* *b的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符
17、号表中a的入口指向符号表中b的入口第26页/共62页27a+5* *b的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中a的入口指向符号表中b的入口第27页/共62页28a+5* *b的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.nptr+F.nptrF.nptridnumididnum 5+指向符号表中a的入口指向符号表中b的入口第28页/共62页29a+5* *b的语法树的构造E.nptrT.nptrE.nptrT.nptrF.nptridT.np
18、tr+F.nptrF.nptridnumididnum 5+指向符号表中a的入口指向符号表中b的入口第29页/共62页303.3. S-属性文法的自下而上计算S-属性文法:只含有综合属性的属性文法。 在自底向上的分析法如LR分析法中,我们使用一个栈来存放已经分析过的子树的信息,现在可以在分析栈中使用一个附加的域来存放综合属性值。 如果一个属性文法是S-属性文法,那么在计算每个语义规则时,分析栈中栈顶处正好就是计算语义规则时需要用到的其它属性值。第30页/共62页31 假设图中的栈是由一对数组state和val来实现的。每一个state元素都是一个指向LR(1)分析表的指针(或索引)。(注意,文
19、法符号隐含在state中而不需要存储在栈中)。然而,如果像前面LR分析时的那样把文法符号存入栈中时,那么当第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的值放在valtop-2中。如果一个符号没有综合属性,那么数组val中相应的元素就不定义。归约后,top值减2,A的状态存放在statetop中(也就是X的位置)综合属
20、性A.a的值存放在valtop中。第31页/共62页32边分析边翻译的方式能否用于继承属性? 属性的计算次序一定受分析方法所限定的分析树结点建立次序的限制 分析树的结点是自左向右生成 如果属性信息是自左向右流动,那么就有可能在分析的同时完成属性计算第32页/共62页334.4. L- L-属性文法和自顶向下翻译L-属性文法:如果对于每个产生式AX1X2Xn的每个语义规则中,每个属性或者是综合属性,或者是Xj(1=j=n)的一个继承属性且这个继承属性仅依赖于: (1)产生式Xj的左边符号X1,X2,Xj-1的属性 (2)A的继承属性。L-属性文法也就是“左属性”文法,计算每一个继承属性时不能引用
21、右边符号的属性(继承属性和综合属性)。由此定义可知,S属性文法一定是L属性文法。第33页/共62页34 翻译模式 属性文法可以看成是关于语言翻译的高级规范说明,其中隐去实现细节,使用户从明确说明翻译顺序的工作中解脱出来。下面我们讨论一种适合语法制导翻译的另一种描述形式,称为翻译模式。翻译模式给出了使用语义规则进行计算的次序,这样就可以把某些实现细节表示出来。在翻译模式中,和文法符号相关的属性和语义规则(这里我们也称语义动作),用花括号 括起来,插入到产生式右部的合适位置上。这样翻译模式给出了使用语义规则进行计算的顺序。第34页/共62页35对继承属性出现位置的限制为了计算出继承属性,翻译模式必
22、须满足三个条件: (1)产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来。 (2)一个动作不能引用这个动作右边符号的综合属性。 (3)产生式左边非终结符的综合属性只有在它所引用的所有属性都计算出来后才能计算。计算这种属性的动作通常可放在产生式右端的末尾。第35页/共62页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 := 1; A1 A2.in := 2; A2 A a print(A.i
23、n) 第36页/共62页37自顶向下翻译 在第四讲我们知道,为了构造不带回溯的自顶向下语法分析,必须消除文法中的左递归。现在我们把前面消除左递归的方法加以扩充,当消除一个翻译模式的基本语法的左递归时同时考虑属性。这种方法适合带综合属性的翻译模式。这样许多文法可以使用自顶向下分析来实现。第37页/共62页38消除左递归推广转换左递规翻译模式的方法,以便进行自顶向下分析: 假设我们有下面的翻译模式: AA1Y A.a:=g(A1.a,Y.y) AX A.a:=f(X.x) 其每个文法符号都有一个综合属性,用小写字母表示,g和f是任意函数。利用第四章消除左递归的算法,可将其转换成下面文法: AXR
24、R YR|第38页/共62页39 翻译模式变为: AX 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. 考虑产生算术表达式的文法,它的翻译模式如何? ?考虑语义动作第39页/共62页40 求值翻译模式: 使用属性valval来保存计算结果 ET R.i:=T.val ET R.i:=T.
25、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.val第40页/共62页41 构造语法树的翻译模式: 使用属性p来保存语法子树的根结点指针 ET R.i:=T.p R E.p:=R.s R+ T R1.i:=mknod(+,R.i,
26、T.p) R1 R.s:= R1.s R R.s:= R.i T( E ) T.p:= E.p Tnum T.p:=mkleaf(num,num.val)第41页/共62页42递归下降翻译器的构造递归下降翻译器的构造 思想:对递归下降的语法分析器进行扩展(在适当的位置加入语义子程序),使之能够实现翻译模式。 方法: 为每个非终结符A构造一个函数,A的继承属性对应该函数的形式参数,其返回值为A的综合属性。函数体内,对出现在A的产生式右部的每个文法符号的每个属性都设置一个局部变量。 控制流程依然由递归下降分析方法确定。第42页/共62页43 在每个产生式对应的程序代码中,按照从左到右的次序,对于终
27、结符、非终结符及其语义动作分别作以下工作: 对于带有综合属性x的终结符X,把x的值存入为X.x设置的变量中。然后产生一个匹配X的调用,并继续输入。 对于每个非终结符B,产生一个右部带有函数调用的赋值语句 c=B(b1,b2,.,bn),其中b1,b2,.,bn是为B的继承属性设置的变量, c是为B的综合属性设置的变量。 对于语义动作,把动作的代码抄进语法分析器中,并把对属性的引用改为对相应变量的引用。 思考:实现上述算术表达式文法的翻译模式,产生语法树。第43页/共62页44 预测翻译器的设计:示例把预测分析器的构造方法推广到翻译方案的实现产生式R +TR | 的分析过程procedure R
28、;beginif lookahead = + then beginmatch ( + ); T ; Rendelse begin / 什么也不做 /endend 第44页/共62页45function 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 =
29、 mknode(addoplexme, i , nptr) ; s1 = R (i1 ); s = s1endelse s = i; / 产生式 R /return send;R : i, sT : nptr+ : addoplexeme第45页/共62页46 5.5. 自下而上计算继承属性 自下而上地计算L-属性。可以基于所有LL(1)文法和许多LR(1)的L-属性文法。1.从翻译模式中去掉嵌入在产生式中间的动作2.分析栈中的继承属性 复写规则:能够预知属性值在栈中的存放位置3.模拟继承属性的计算 不能预知属性值在栈中的存放位置时,通过模拟非终结符、修改翻译模式归结为2中的情形4.用综合属性
30、代替继承属性 改变基础文法以避免继承属性 详见参考书第46页/共62页47习题一 下列文法由开始符号S产生一个二进制数,令综合属性val给出该数的值:SL . L|LL LB|BB 0|1 试设计求S.val的属性文法。其中,已知B的综合属性c,给出由B产生的二进位的结果值。第47页/共62页48方法1:使用L.val、L.len属性SL S.val = L.val S L1. L2 S . v a l = L1. v a l + L2.val/2L2.lenL BL.val = B.c, L.len = 1L L1BL.val = 2*L1.val + B.c, L.len = L1.len
31、 + 1B 0B.c = 0B 1B.c = 1第48页/共62页49方法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 = 2*L1.lval + B.c, L.w = 2 * L1.w B 0B.c = 0B 1B.c = 1第49页/共62页50为下面文法写一个语法制导的定义,用S S的综合属性valval给出下面文法中S S产生的二进制数的值。例如,输入101.101101.101时,S. S. valval = 5.
32、625 = 5.625。不得修改文法,但属性使用没有限制S L . R | LL L B | BR B R | BB 0 | 1S.LLBLBBRRBRBB习题二第50页/共62页51S L . RS. val = L. 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 = 1第51页/共62页52给出把中缀表达式翻译
33、成没有冗余括号的中缀表达式的语法制导定义。例如, ,因为 和 是左结合, ,(a (b + c ) (d )可以重写成a (b + c ) d 先把表达式的括号都去掉,然后在必要的地方再加括号 去掉表达式中的冗余括号,保留必要的括号 习题三第52页/共62页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. op第53页/共62页54T T1 Fif (F. op = plus) or (F. op = times) thenif T1. op = plus thenT. code = “(” | T1. code | “)” | “ ” | “(” | F. code | “)”elseT. code = T1. code | “ ” | “(” | F. code | “)”else if T1. op = plus thenT. code = “(” | T1. code | “)” | “ ” | F. code
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 快递员工培训课件
- 宠物养殖租赁合同范本
- 金属桥架合同范本
- 小学生食品安全课件
- 高低压配电工程施工承包合同
- 检验灭火器合同书
- 关于采购办公用品的申请报告与审批流程说明
- 民族局离婚协议书
- 中学生课外阅读指南观后感
- 法律咨询行业法律建议免责
- 2025年上半年永春县农文旅发展集团限公司公开招聘若干名工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 中职高教版(2023)语文职业模块-第五单元:走近大国工匠(一)展示国家工程-了解工匠贡献【课件】
- 物业管理车辆出入管理制度
- 家庭康复服务的商业价值与发展趋势
- 2025年施工项目部《春节节后复工复产》工作实施方案 (3份)-75
- 矿山安全生产工作总结
- 小学教师培训课件:做有品位的小学数学教师
- U8UAP开发手册资料
- 监护人考试20241208练习试题附答案
- 证券公司装修施工合同工程
- 人教版PEP三年级到六年级单词以及重点句型
评论
0/150
提交评论