《编译原理属性文法和语法制导翻译.pptx》由会员分享,可在线阅读,更多相关《编译原理属性文法和语法制导翻译.pptx(79页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、6.1 6.1 属性文法属性文法(也称属性翻译文法)Knuth在1968年提出在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性)。属性代表与文法符号相关信息,如类型、值、代码序列、符号表内容等属性可以进行计算和传递语义规则:对于文法的每个产生式都配备了一组属性的计算规则第1页/共79页属性综合属性:“自下而上”传递信息继承属性:“自上而下”传递信息在一个属性文法中,对应于每个产生式A 都有一套与之相关联的语义规则,每条规则的形式为:b:=f(c1,c2,ck)这里,f是一个函数,而且或者1.b是A的一个综合属性并且c1,c2,ck是产生式右边文法符号的
2、属性,或者2.b是产生式右边某个文法符号的一个继承属性并且c1,c2,ck是A或产生式右边任何文法符号的属性。属性b依赖于属性c1,c2,ck。第2页/共79页3属性文法的说明属性文法的说明(1)(1)n(1)(1)终结符只有综合属性终结符只有综合属性,它它由词法分析器提供由词法分析器提供n例如 digit.lexval 表示单词符号“数”的词法值 id.entry 表示单词符号“标识符”的符号表入口n(2)(2)非终结符既可以有综合属性也可以有继承非终结符既可以有综合属性也可以有继承属性属性,在属性文法的语义规则中计算,在属性文法的语义规则中计算n(3)(3)关于属性计算的规定关于属性计算的
3、规定 文法的开始符号的所有继承属性作为属性计算前的初始值。一般来讲,对出现在产生式 A X1X2Xn左边的非终结符A A的综合属性和出现在产生式右部的符号X Xi i的继承属性都必须提供一个计算规则。第3页/共79页4n 与产生式 A X1X2Xn 相关联的属性计算规则只能是 A.综合属性和Xi.继承属性的计算。不能有A的继承属性和Xi 的综合属性的计算规则。n 出现在产生式左边非终结符A的继承属性和出现在产生式右边符号Xi 的综合属性不由所给的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算。n 属性计算规则中只能使用相应产生式 A X1X2Xn的文法符号A,X1,X2,Xn的属
4、性,这有利于在产生式范围内“封装”属性的依赖性。属性文法的说明属性文法的说明(2)2)第4页/共79页5语义规则所描述的工作语义规则所描述的工作语义规则所描述的工作可以是任何希望的翻译工作,如:属性计算、静态语义检查、符号表操作、中间代码生成、报告出错,等等。语义规则可能产生副作用(如产生代码),也可能不是变元的严格函数 b:=f(cb:=f(c1 1,c,c2 2,c,ck k),如某个规则给出可用的下一个数据单元的地址。这样的语义规则通常写成过程调用或过程段-这时认为定义了一个虚属性。第5页/共79页例,考虑非终结符A,B和C,其中,A有一个继承属性a和一个综合属性b,B有综合属性c,C有
5、继承属性d。产生式ABC可能有规则C.d:=B.c+1A.b:=A.a+B.c而属性A.a和B.c在其它地方计算第6页/共79页产生式LEnEE1+TETTT1*FTFF(E)Fdigit语 义 规 则print(E.val)E.val:=E1.val+T.val E.val:=T.val T.val:=T1.val*F.val T.val:=F.val F.val:=E.val F.val:=digit.lexval第7页/共79页综合属性在语法树中,一个结点的综合属性的值由其子结点的属性值确定。使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值仅仅使用综合属性的属性文法称S属性文
6、法第8页/共79页产生式LEnEE1+TETTT1*FTFF(E)Fdigit语 义 规 则print(E.val)E.val:=E1.val+T.val E.val:=T.val T.val:=T1.val*F.val T.val:=F.val F.val:=E.val F.val:=digit.lexval第9页/共79页3*5+4n的带注释的语法树digit.lexval=3F.val=3T.val=3*digit.lexval=5F.val=5T.val=15E.val=15+digit.lexval=4F.val=4T.val=4E.val=19nL 产生式语义规则LEnprint(
7、E.val)EE1+TE.val:=E1.val+T.valETE.val:=T.valTT1*FT.val:=T1.val*F.valTF T.val:=F.valF(E)F.val:=E.valFdigitF.val:=digit.lexval第10页/共79页继承属性在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定用继承属性来表示程序设计语言结构中的上下文依赖关系很方便第11页/共79页产生式语义规则DTLL.in:=T.type TintT.type:=integer TrealT.type:=real LL1,idL1.in:=L.inaddtype(id.
8、entry,L.in)Lidaddtype(id.entry,L.in)第12页/共79页句子realid1,id2,id3的带注释的语法树id1L,id2L,id3LrealTDT.type=realL.in=realL.in=realL.in=real产生式语义规则DTLL.in:=T.typeTint T.type:=integerTrealT.type:=realLL1,idL1.in:=L.inaddtype(id.entry,L.in)Lid addtype(id.entry,L.in)第13页/共79页6.2基于属性文法的的处理方法由源程序的语法结构所驱动的处理办法就是语法制导翻
9、译法语义规则的计算产生代码在符号表中存放信息给出错误信息执行任何其它动作对输入符号串的翻译也就是根据语义规则进行计算的结果。输入串语法树依赖图语义规则计算次序第14页/共79页6.2基于属性文法的的处理方法依赖图树遍历一遍扫描第15页/共79页6.2.1依赖图在一棵语法树中的结点的继承属性和综合属性之间的相互依赖关系可以由称作依赖图的一个有向图来描述为每一个包含过程调用的语义规则引入一个虚综合属性b,这样把每一个语义规则都写成b:=f(c1,c2,ck)的形式依赖图中为每一个属性设置一个结点,如果属性b依赖于属性c,则从属性c的结点有一条有向边连到属性b的结点。第16页/共79页for语法树中
10、每一结点ndofor结点n的文法符号的每一个属性ado为a在依赖图中建立一个结点;for语法树中每一个结点ndofor结点n所用产生式对应的每一个语义规则b:=f(c1,c2,ck)dofori:=1tokdo从ci结点到b结点构造一条有向边;第17页/共79页EE1E2E.val:=E1.val+E2.valE1+E2Evalvalval第18页/共79页句子realid1,id2,id3的带注释的语法树的依赖图id1L,id2L,id3LrealTD4type5in6-addtype(id.entry,L.in)7in8 addtype9in10 addtype1entry2entry3e
11、ntry产生式语义规则DTLL.in:=T.typeTint T.type:=integerTrealT.type:=realLL1,idL1.in:=L.inaddtype(id.entry,L.in)Lid addtype(id.entry,L.in)第19页/共79页如果一属性文法不存在属性之间的循环依赖关系,那么称该文法为良定义的第20页/共79页属性的计算次序一个依赖图的任何拓扑排序都给出一个语法树中结点的语义规则计算的有效顺序属性文法说明的翻译是很精确的基础文法用于建立输入符号串的语法分析树根据语义规则建立依赖图从依赖图的拓扑排序中,我们可以得到计算语义规则的顺序输入串语法树依赖图
12、语义规则计算次序第21页/共79页句子realid1,id2,id3的带注释的语法树的依赖图id1L,id2L,id3LrealTD4type5in67in89in101entry2entry3entrya4:=real;a5:=a4addtype(id3.entry,a5);a7:=a5;addtype(id2.entry,a7);a9:=a7addtype(id1.entry,a9);第22页/共79页6.2基于属性文法的的处理方法依赖图树遍历一遍扫描第23页/共79页6.2.2树遍历的属性计算方法通过树遍历的方法计算属性的值假设语法树已建立,且树中已带有开始符号的继承属性和终结符的综合属
13、性以某种次序遍历语法树,直至计算出所有属性深度优先,从左到右的遍历第24页/共79页While 还有未被计算的属性 doVisitNode(S)/*S是开始符号*/procedure VisitNode(N:Node);begin if N是一个非终结符 then /*假设它的产生式为NX1Xm*/for i:=1 to m do if Xi VN then/*即Xi是非终结符*/begin 计算Xi的所有能够计算的继承属性;VisitNode(Xi)end;计算N的所有能够计算的综合属性end第25页/共79页产 生 式语 义 规 则SXYZZ.h:=S.aX.c:=Z.gS.b:=X.d-
14、2Y.e:=S.bXx X.d:=2*X.cYy Y.f:=Y.e*3Zz Z.g:=Z.h+1例考虑属性的文法G。其中,S有继承属性a,综合属性b;X有继承属性c、综合属性d;Y有继承属性e、综合属性f;Z有继承属性h、综合属性g第26页/共79页假设S.a的初始值为0,输入串为xyzS:a=0XYZxyzZ:h=0 g=1X:c=1 d=2S:a=0,b=0Y:e=0 f=0产生式语义规则SXYZZ.h:=S.aX.c:=Z.gS.b:=X.d-2Y.e:=S.bXxX.d:=2*X.cYyY.f:=Y.e*3ZzZ.g:=Z.h+1第27页/共79页6.2基于属性文法的的处理方法依赖图树
15、遍历一遍扫描第28页/共79页6.2.3一遍扫描的处理方法一遍扫描的处理方法是在语法分析的同时计算属性值所采用的语法分析方法属性的计算次序L属性文法适合于一遍扫描的自上而下分析S属性文法适合于一遍扫描的自下而上分析第29页/共79页所谓语法制导翻译法,直观上说就是为文法中每个产生式配上一组语义规则,并且在语法分析的同时执行这些语义规则语义规则就被计算的时机在自上而下语法分析中,一个产生式匹配输入串成功时在自下而上分析中,当一个产生式被用于进行归约时第30页/共79页6.2.4抽象语法树在语法树中去掉那些对翻译不必要的信息,从而获得更有效的源程序中间表示。这种经变换后的语法树称之为抽象语法树(A
16、bstractSyntaxTree)BS1S2if_then_elseq Sif B then S1 else S2q 3*5+4*54+3第31页/共79页建立表达式的抽象语法树mknode(op,left,right)建立一个运算符号结点,标号是op,两个域left和right分别指向左子树和右子树。mkleaf(id,entry)建立一个标识符结点,标号为id,一个域eutry指向标识符在符号表中的入口。mkleaf(num,val)建立一个数结点,标号为num,一个域val用于存放数的值。第32页/共79页建立抽象语法树的语义规则产产生生式式语语义义规规则则EE1+TE.nptr:=m
17、knode(+,E1.nptr,T.nptr)EE1-TE.nptr:=mknode(-,E1.nptr,T.nptr)ETE.nptr:=T.nptrT(E)T.nptr:=E.nptrTidT.nptr:=mknode(id,id.entry)TnumT.nptr:=mknode(num,num.val)第33页/共79页a4c的抽象语法树E nptrT nptrE nptrTo entry for aET nptrid-T nptridid-idnum 4+To entry for c第34页/共79页一遍扫描的处理方法一遍扫描的处理方法是在语法分析的同时计算属性值所采用的语法分析方法属
18、性的计算次序L属性文法适合于一遍扫描的自上而下分析S属性文法适合于一遍扫描的自下而上分析第35页/共79页6.3S-属性文法的自下而上计算S-属性文法:只含有综合属性综合属性可以在分析输入符号串的同时由自下而上的分析器来计算。分析器可以保存与栈中文法符号有关的综合属性值,每当进行归约时,新的属性值就由栈中正在归约的产生式右边符号的属性值来计算。第36页/共79页在分析栈中使用一个附加的域来存放综合属性值假设语义规则A.a:=f(X.x,Y.y,Z.z)是对应于产生式AXYZ的第37页/共79页产生式 代 码 段 LEnprint(valtop)EE1+Tvalntop:=valtop-2+va
19、ltopETTT1*Fvalntop:=valtop-2*valtopTFF(E)valntop:=valtop-1Fdigit 产 生 式 语 义 规 则 LEn print(E.val)EE1+T E.val:=E1.val+T.val ET E.val:=T.val TT1*F T.val:=T1.val*F.val TF T.val:=F.val F(E)F.val:=E.val Fdigit F.val:=digit.lexval第38页/共79页输入 statesym val用到的产生式3*5+4n0#-*5+4n05#3-3*5+4n03#F-3 Fdigit*5+4n02#T-
20、3 TF5+4n027#T*-3-+4n0275#T*5-3-5产生式 代 码 段 LEnprint(valtop)EE1+Tvalntop:=valtop-2+valtop ETTT1*Fvalntop:=valtop-2*valtop TFF(E)valntop:=valtop-1Fdigit 第39页/共79页输入 statesym val用到的产生式+4n0275#T*5-3-5+4n02710#T*F-3-5Fdigit+4n02#T-15TT*F+4n01#E-15ET4n016#E+-15-n0165#E+4-15-4产生式 代 码 段 LEnprint(valtop)EE1+T
21、valntop:=valtop-2+valtop ETTT1*Fvalntop:=valtop-2*valtop TFF(E)valntop:=valtop-1Fdigit 第40页/共79页输入 statesymval用到的产生式n0165#E+4-15-4n0163#E+F-15-4Fdigitn0169#E+T-15-4TFn01#E-19EE+T#En-19-#L-19LEn产生式 代 码 段 LEnprint(valtop)EE1+Tvalntop:=valtop-2+valtop ETTT1*Fvalntop:=valtop-2*valtop TFF(E)valntop:=valt
22、op-1Fdigit 第41页/共79页一遍扫描的处理方法一遍扫描的处理方法是在语法分析的同时计算属性值所采用的语法分析方法属性的计算次序L属性文法适合于一遍扫描的自上而下分析S属性文法适合于一遍扫描的自下而上分析第42页/共79页6.4L-属性文法和自顶向下翻译通过深度优先的方法对语法树进行遍历,计算属性文法的所有属性值LL(1):自上而下分析方法,深度优先建立语法树第43页/共79页一个属性文法称为L-属性文法,如果对于每个产生式AX1X2Xn,其每个语义规则中的每个属性或者是综合属性,或者是Xj(1 j n)的一个继承属性且这个继承属性仅依赖于:(1)产生式Xj的左边符号X1,X2,Xj
23、-1的属性;(2)A的继承属性。S-属性文法一定是L-属性文法第44页/共79页产生式语义规则ALML.i:=l(A.i)M.i:=m(L.s)AQRR.i:=r(A.i)Q.i:=q(R.s)A.s:=f(Q.s)因为 Q.i 依赖于右部符号R的综合属性R.s第45页/共79页6.4.1翻译模式翻译模式:给出了使用语义规则进行计算的次序,这样就可把某些实现细节表示出来在翻译模式中,和文法符号相关的属性和语义规则(这里我们也称语义动作),用花括号括起来,插入到产生式右部的合适位置上R addop T R print(addop.lexme)R第46页/共79页ET RR addop T pri
24、nt(addop.lexme)R|T num print(num.lexme)例:将含有+和-运算的中缀表达式翻译为后缀形式如 表达式 9-+2 后缀表示为 9-2+l翻译模式给出了使用语义规则进行计算的次序,这样就可把某些实现细节表示出来。第47页/共79页图图:9 9+2+2 的说明动作的语法分析树的说明动作的语法分析树ETR9print(9)Tprint()R5print(5)+Tprint(+)2print(2)R 12345把语义动作看作是终结符号把语义动作看作是终结符号按深度优先次序遍历分析树,即得到按深度优先次序遍历分析树,即得到9 5 2ET RR addop T print(
25、addop.lexme)R|T num print(num.lexme)参考输出后缀式的属性文法第48页/共79页设计翻译模式的原则设计翻译模式时,必须保证当某个动作引用一个属性时它必须是有定义的。L-属性文法本身就能确保每个动作不会引用尚未计算出来的属性。第49页/共79页建立翻译模式当只需要综合属性时:为每一个语义规则建立一个包含赋值的动作,并把这个动作放在相应的产生式右边的末尾产生式语义规则TT1*FT.val:=T1.valF.val建立产生式和语义动作:TT1*FT.val:=T1.valF.val第50页/共79页建立翻译模式如果既有综合属性又有继承属性,在建立翻译模式时就必须保证
26、:1.产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来。2.一个动作不能引用这个动作右边的符号的综合属性。3.产生式左边非终结符的综合属性只有在它所引用的所有属性都计算出来以后才能计算。计算这种属性的动作通常可放在产生式右端的末尾。SA1A2A1.in:=1;A2.in:=2Aa print(A.in)第51页/共79页下面的翻译模式不满足上述三个条件中的第一个条件:(1)产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来。SA1 A2 A1.in:=1;A2.in:=2 Aa print(A.in)可以改为 S A1.in:1 A1 A2.in:=2 A2print(A
27、.in)1print(A.in)SAaAa2A1.in:1;A2.in:=23该属性还没有定义第52页/共79页S A1.in:1 A1 A2.in:=2 A2print(A.in)1print(A.in)SAaAa2A2.in:=23A1.in:14第53页/共79页基于数学格式语言EQN给定输入Esubn.valEn.valEn.valEn.valE sub n.val第54页/共79页产产 生生 式式 S B B B1 B2 B B1 sub B2 B text w非终结符非终结符B(B(表示盒子表示盒子)代表一个公式,代表一个公式,w产生式产生式BBB BBB 代表两个盒子并置,代表两
28、个盒子并置,wBBBB1 1 sub B sub B2 2 代表代表B B2 2的大小比的大小比B B1 1的小的小,并且放在下角标的位置并且放在下角标的位置语语 义义 规规 则则 B.ps:=10;S.ht:=B.ht B1.ps:=B.ps;B2.ps:=B.ps;B.ht:=max(B1.ht,B2.ht)B1.ps:=B.ps;B2.ps:=shrink(B.ps);B.ht:=disp(B1.ht,B2.ht)B.ht:=text.h B.ps 使使B2.ps减少减少30%把盒子把盒子B2向下放置向下放置继承属性继承属性ps影响影响公式的高度公式的高度综合属性综合属性B.ht代表代表
29、B的高度的高度查表获得查表获得识别输入并进行格式安放的L-属性文法第55页/共79页翻译模式S B.ps:=10BS.ht:=B.htB B1.ps:=B.psB1B2.ps:=B.psB2B.ht:=max(B1.ht,B2.ht)B B1.ps:=B.psB1subB2.ps:=shrink(B.ps)B2B.ht:=disp(B1.ht,B2.ht)BtextB.ht:=text.hB.ps1.产生式右边的符号的产生式右边的符号的继承属性继承属性必须在这个符必须在这个符号以前的动作中计算出来。号以前的动作中计算出来。2.一个动作不能引用这个动作右边的符号的一个动作不能引用这个动作右边的符
30、号的综综合属性合属性。3.产生式左边非终结符的产生式左边非终结符的综合属性综合属性只有在它所只有在它所引用的所有属性都计算出来以后才能计算。计引用的所有属性都计算出来以后才能计算。计算这种属性的动作通常放在产生式右端的算这种属性的动作通常放在产生式右端的末尾末尾。第56页/共79页6.4.2自顶向下翻译动作是在处于相同位置上的符号被展开(匹配成功)时执行的。为了构造不带回溯的自顶向下语法分析,必须消除文法中的左递归当消除一个翻译模式的基本文法的左递归时同时考虑属性适合带综合属性的翻译模式第57页/共79页关于算术表达式的左递归文法相应的翻译模式EE1+TE.val:=E1.val+T.valE
31、E1-TE.val:=E1.val-T.valETE.val:=T.valT(E)T.val:=E.valTnumT.val:=num.valE T RR +T R1R -T R1R T (E)T num第58页/共79页消除左递归,构造新的翻译模式ETR.i:=T.valRE.val:=R.sR+TR1.i:=R.i+T.val R1R.s:=R1.sR-TR1.i:=R.i-T.valR1R.s:=R1.sR R.s:=R.iT(E)T.val:=E.valTnumT.val:=num.valE T RR +TR1R -TR1R T (E)T numR.i:R前面子表达式前面子表达式 的值
32、的值R.s:分析完分析完R时子表时子表 达式的值达式的值第59页/共79页计算表达式952ETRnumnum.val=9T.val=9R.i=9-TRnumnum.val=5T.val=5R.i=4+TRnumnum.val=2T.val=2R.i=6 R.s=6R.s=6R.s=6E.val=6ET R.i:=T.valRE.val:=R.sR+T R1.i:=R.i+T.valR1R.s:=R1.sR-TR1.i:=R.i-T.valR1R.s:=R1.sR R.s:=R.iT(E)T.val:=E.valTnumT.val:=num.val第60页/共79页一般方法假设有翻译模式:AA1
33、YA.a:=g(A1.a,Y.y)AXA.a:=f(X.x)它的每个文法符号都有一个综合属性,用小写字母表示,g和f是任意函数。q消除左递归:AXR RYR|q翻译模式变为:A XR.i:=f(X.x)RA.a:=R.sR Y R1.i:=g(R.i,Y.y)R1R.s:=R1.sR R.s:=R.iR.i:R前面子表达式前面子表达式 的值的值R.s:分析完分析完R时子表时子表 达式的值达式的值第61页/共79页XYYXA A.a=f(X.x)Y1A A.a=g(f(X.x),Y1.y)Y2A A.a=g(g(f(X.x),Y1.y),Y2.y)AA1YA.a:=g(A1.a,Y.y)AXA.
34、a:=f(X.x)第62页/共79页XYY AXR R.i=f(X.x)Y1R R.i=g(f(X.x),Y1.y)Y2R R.i=g(g(f(X.x),Y1.y),Y2.y)R.s=g(g(f(X.x),Y1.y),Y2.y)R.s=g(g(f(X.x),Y1.y),Y2.y)R.s=g(g(f(X.x),Y1.y),Y2.y)A.a=g(g(f(X.x),Y1.y),Y2.y)A X R.i:=f(X.x)R A.a:=R.sR Y R1.i:=g(R.i,Y.y)R1 R.s:=R1.sR R.s:=R.i第63页/共79页构造抽象语法树的属性文法定义转化成翻译模式EE1+TE.nptr
35、:=mknode(+,E1.nptr,T.nptr)EE1-TE.nptr:=mknode(-,E1.nptr,T.nptr)ETE.nptr:=T.nptr第64页/共79页构造抽象语法树的属性文法定义转化成翻译模式ETR.i:=T.nptrRE.nptr:=R.sR+TR1.i:=mknode(+,R.i,T.nptr)R1R.s:=R1.sR-TR1.i:=mknode(,R.i,T.nptr)R1R.s:=R.sR R.s:=R.iT(E)T.nptr:=E.nptrTidT.nptr:=mkleaf(id,id.entry)Tnum T.nptr:=mkleaf(num,num.va
36、l)第65页/共79页使用继承属性构造a4c的抽象语法树ETRidTo entry for aidT.nptr-Tnumnum 4T.nptrR.i-R+TRidTo entry for cidT.nptrR.i+R.i R.sR.sR.sE.nptrE T R.i:=T.nptr R E.nptr:=R.sR +T R1.i:=mknode(+,R.i,T.nptr)R1 R.s:=R1.sR -T R1.i:=mknode(,R.i,T.nptr)R1 R.s:=R.sR R.s:=R.iT (E )T.nptr:=E.nptrT id T.nptr:=mkleaf(id,id.entry
37、)T num T.nptr:=mkleaf(num,num.val)第66页/共79页6.4.3递归下降翻译器的设计如何在递归下降分析中实现翻译模式,构造递归下降翻译器递归下降翻译器第67页/共79页设计递归下降翻译器的方法1.对每个非终结符A构造一个函数过程,对A的每个继承属性设置一个形式参数函数的返回值为A的综合属性(作为记录,或指向记录的一个指针,记录中有若干域,每个属性对应一个域)。为了简单,我们假设每个非终结只有一个综合属性A对应的函数过程中,为出现在A的产生式中的每一个文法符号的每一个属性都设置一个局部变量。第68页/共79页设计递归下降翻译器的方法2.非终结符A对应的函数过程中,
38、根据当前的输入符号决定使用哪个产生式候选。第69页/共79页设计递归下降翻译器的方法3.每个产生式对应的程序代码中,按照从左到右的次序,对于单词符号(终结符)、非终结符和语义动作分别作以下工作:i)对于带有综合属性x的终结符X,把x的值存入为X.x设置的变量中。然后产生一个匹配X的调用,并继续读入一个输入符号。ii)对于每个非终结符B,产生一个右边带有函数调用的赋值语句c=B(b1,b2,bk),其中,b1,b2,bk是为B的继承属性设置的变量,c是为B的综合属性设置的变量。iii)对于语义动作,把动作的代码抄进分析器中,用代表属性的变量来代替对属性的每一次引用。第70页/共79页构造抽象语法
39、树的属性文法定义转化成翻译模式ETR.i:=T.nptrRE.nptr:=R.sR+TR1.i:=mknode(+,R.i,T.nptr)R1R.s:=R1.sR-TR1.i:=mknode(,R.i,T.nptr)R1R.s:=R.sR R.s:=R.iT(E)T.nptr:=E.nptrTidT.nptr:=mkleaf(id,id.entry)Tnum T.nptr:=mkleaf(num,num.val)第71页/共79页非终结符E、R、T的函数及其参数类型functionE:AST-node;functionR(in:AST-node):AST-node;functionT:AST-
40、node;用oddop代表和RoddopTR1.i:=mknode(addop.lexme,R.i,T.nptr)R1R.s:=R1.sR R.s:=R.i第72页/共79页产生式RaddopTR|的分析过程procedareR;beginifsym=addopthenbegin advance;T;Rendelsebegin/*donothing*/endend;第73页/共79页functionR(in:AST-node):AST-node;varnptr,i1,s1,s:AST-node;addoplexeme:char;beginifsym=addopthenbegin/*产生式Rad
41、dopTR*/addoplexeme:=lexval;advance;nptr:=T;i1:=mknode(addoplexeme,in,nptr);s1:=R(i1)s:=s1endelses:=in;returnsend;R oddop T R1.i:=mknode(addop.lexme,R.i,T.nptr)R1 R.s:=R1.s R R.s:=R.i第74页/共79页6.5自下而上计算继承属性在自下而上的分析过程中实现L-属性文法的方法可实现任何基于LL(1)文法的L-属性文法,还可以实现许多(不是所有)基于LR(1)文法的L-属性文法第75页/共79页6.5.1从翻译模式中去掉嵌入在产生式中间的动作要求把所有的语义动作都放在产生式的末尾转换方法,它可以使所有嵌入的动作都出现在产生式的末尾加入新的产生式M 把嵌入在产生式中的每个语义动作用不同的标记非终结符M代替,并把这个动作放在产生式M 的末尾第76页/共79页翻译模式ETRRTprint()R|Tprint()R|Tnumprint(num.val)转换为ETRRTMR|TNR|Tnumprint(num.val)M print()N print()第77页/共79页作业P164-1,2,5,7P164-11,12(选作)第78页/共79页79感谢您的观看!第79页/共79页