第五章语法制导翻译.ppt

上传人:本田雅阁 文档编号:3121318 上传时间:2019-07-13 格式:PPT 页数:99 大小:943.52KB
返回 下载 相关 举报
第五章语法制导翻译.ppt_第1页
第1页 / 共99页
第五章语法制导翻译.ppt_第2页
第2页 / 共99页
第五章语法制导翻译.ppt_第3页
第3页 / 共99页
第五章语法制导翻译.ppt_第4页
第4页 / 共99页
第五章语法制导翻译.ppt_第5页
第5页 / 共99页
点击查看更多>>
资源描述

《第五章语法制导翻译.ppt》由会员分享,可在线阅读,更多相关《第五章语法制导翻译.ppt(99页珍藏版)》请在三一文库上搜索。

1、语法制导翻译,?为什么进行词法和语法分析 ?用A进行归约表达的是什么意思 看:operand+term EE1+T E1的值+T的值的结果作为E的值即:取来E1的值和T的值做加法运算,结果作为E的值 E.val=E1.val+T.val,第五章 语法制导翻译,翻译的任务 首先是语义分析和正确性检查,若正确,则翻译成中间代码或目标代码。 基本思想 根据翻译的需要设置文法符号的属性,以描述语法结构的语义。 例如,一个变量的属性有类型,层次,存储地址等。表达式的属性有类型,值等。 属性值的计算和产生式相联系。随着语法分析的进行,执行属性值的计算,完成语义分析和翻译的任务。,5.1 语法制导翻译概述,

2、语法制导翻译的概念描述 在进行语法分析的同时,完成相应的语义处理 EE1 + E2 E.val:=E1.val+E2.val 语法结构具有规定的语义 问题:如何根据被识别出的语法成分进行语义处理?,1. 语义分析的任务,语义检查 例:类型、运算、维数、越界 语义处理 例:变量的存储分配 例:表达式的求值 例:语句的翻译(中间代码的生成) 总目标:生成等价的中间代码,2. 代码结构,计算学科:对信息(数据表示)描述和变换算法的系统研究 变换:源、目标以及源与目标的对应关系 语句的代码结构 语句分类: 说明语句符号表的查填 可执行语句指令代码,3. 典型处理方法,对应每一个产生式编制一个语义子程序

3、,当一个产生式获得匹配时,调用相应的语义子程序实现语义检查与翻译 EE1 + T E.val:=E1.val+T.val TT1 * F T.val:=T1.val*F.val F id F.val:=id.val 适宜在完成归约的时候进行,3. 典型处理方法,在产生式的右部的适当位置,插入相应的语义动作,按照分析的进程,执行遇到的语义动作 D T L.in := T.type L T int T.type := integer T real T.type := real L L1.in := L.in L1,id 语义可以看成是相应文法符号的属性 适宜在进行推导时完成,语义翻译的流程,输 入

4、 符 号 串,分 析 树,依 赖 图,语 义 规 则 的 计 算,实际上,编译中语义翻译的实现并不是按图中的流程处理的;而是随语法分析的进展,识别出一个语法结构,就对它的语义进行分析和翻译。,语法制导定义是对上下文无关文法的推广 每个文法符号都有一个相关的属性集。 综合属性:通过分析树中其子节点的属性值计算出来; 继承属性:由该节点的兄弟节点及父节点的属性值计算出来; 依赖图 语义规则建立了属性之间的依赖关系,这些关系可以用图来表示,这样的图称为依赖图。,属性,5.1 语法制导定义(Syntax-directed definitions),在一个语法制导定义中,AP都有与 之相关联的一套语义规

5、则,规则形式为 b:= f(c1,c2,ck), f是一个函数,而且或者 1b是A的一个综合属性并且c1,c2,ck 是中的符号的属性,或者 2b是中的符号的一个继承属性并且c1, c2,ck是A或中的任何文法符号的属性。 在两种情况下,都说属性b依赖于属性c1,c2,ck。,5.1.1 语法制导定义的形式,例5.1 台式计算器程序的语法制导定义(图52),产生式 语义规则,LEn print(Eval)(可看作是L的虚属性) E E1+T E val := E1 val+T val E T E val := T val T T1*F T val := T1 val*F val T F T v

6、al := F val F (E) F val := E val F digit F val := digitlexval,S-属性定义 仅仅使用综合属性的语法制导定义。 结点属性值的计算正好和自底向上分析建立分析树结点同步进行。 例 5 .2 输入:3*5+4n,5.1.2 综合属性,digitlexval:=3,Fval:=3,Tval:=3,digitlexval:=5,Fval:=5,Tval:=15,*,Eval:=15,+,digitlexval:=4,Fval:=4,Tval:=4,Eval:=19,L,n,综合属性值的计算方法 对于s-属性定义,通常使用自底向上的分析方法,在建

7、立每一个结点处使用语义规则来计算综合属性值,即在用哪个产生式进行归约后,就执行那个产生式的s-属性定义计算属性的值,从叶结点到根结点进行计算。 5.1.3 继承属性 继承属性值是由此结点的父结点和或兄弟结点的某些属性值来决定的。 例5 . 3 变量说明的属性定义 int a,b,c,表5.2 带有继承属性L.in的语法制导定义,产生式 语义规则 DTL Lin:=T type T int T type :=integer T real T type :=real L L1,id L1 in :=L in addtype(id entry,L in) L id addtype(id entry,

8、L in),T,L,L,id3,L,id2,D,id1,real,1 entry,2 entry,3 entry,4 type,in 5,6,in 7,8,in 9,10,依赖图的构造方法 for 分析树中的每个结点n do for 与结点n对应的文法符号的每个属性a do 在依赖图中为a构造一个结点; for 分析树的每个结点n do for 结点n所用产生式对应的每条 语义规则 b:f(c1,c2,ck ) do for i:=1 to k do 从结点ci到结点b构造一条有向边;,5.1.4 依赖图_获得语义规则的计算顺序,例5-5 图55分析树的依赖图,拓扑排序 一个无环有向图的拓扑排

9、序是图中 结点的任何顺序m1,m2,mk,使得 边必须是从序列中前面的结点指向后面的 结点,也就是说,如果mimj是mi到mj的 一条边,那么在 序列中mi必须出现在mj的 前面。 若依赖图中无环,则存在一个拓扑排序,它就是属性值的计算顺序。,5.1.5 计算顺序,1, 2, 3,4,5,6,7,8,9,10 a4:=real; a5:=a4; addtype(id3entry,a5); a7:=a5; addtype(id2entry,a7); a9:=a7; addtype(id1entry,a9);,例5 . 6 图5 . 7的拓扑排序是:,分析树法: 输入串分析树依赖图计算次序 基于规

10、则的方法: 在构造编译器时,用手工或专门的工具来分析语义规则,确定属性值的计算顺序。 忽略语义规则的方法:在分析过程中翻译,那么计算顺序由分析方法来确定而表面上与语义规则无关。这种方法限制了能被实现的语法制导定义的种类。 后两种方法不必显式构造依赖图,因此时空效率更高。,计算语义规则的方法,抽象语法(abstract syntax) 从具体语法中抽象出语言结构的本质性的东西,而不考虑语言的具体符号表示,从而可简化语义的形式描述。 在不同的语言中赋值语句有不同的写法: x=y; x:=y; yx 等等,可以用抽象形式 assignment(variable,expression) 把前面各种具体

11、形式统一起来。,5.2 语法树(syntax tree)的构造,表示程序层次结构的树,它把分析树中对语义无关紧要的成分去掉,是分析树的抽象形式 ,也称作语法结构树,或结构树。 语法树是常用的一种中间表示形式。 把语法分析和翻译分开。语法分析过程中完成翻译有许多优点,但也有一些不足: 1.适于语法分析的文法可能不完全反映语言成分的自然层次结构; 2. 由于语法分析方法的限制,对分析树结点的访问顺序和翻译需要的访问顺序不一致。,语法树,产生式sif B then S1 else S2的语法树 if-then-else | B S1 S2 赋值语句的语法树 assignment variable e

12、xpression 在语法树中,运算符号和关键字都不在叶结点,而是在内部结点中出现。,5.2.1 语法树,构造表达式的语法树使用的函数 1. mknode(op,left,right) 建立一个标记为op的运算符结点,两个域left和right是指向左右运算对象的指针。 2mkleaf(id,entry) 建立一个标记为id的标识符结点,其域entry是指向该标识符在符号表中相应表项的指针。 3. mkleaf(num,val) 建立一个标记为num的数结点,域val用于保存该数的值。返回指向新建立结点的指针。,5.2.2 构造表达式的语法树,id,to entry a,num 4,id,to

13、 entry c,+,图5-8 a-4+c的语法树,5.2.3 构造语法树的语法制导定义,产生式 语义规则 EE1+T E.nptr:=mknode(+,E1.nptr,T.nptr) E E1-T E.nptr:=mknode(-,E1.nptr,T.nptr) E T E.nptr:=T.nptr T (E) T.nptr:=E.nptr T id T.nptr:=mkleaf(id,id.entry) T num T.nptr:=mkleaf(num,num.val),图5-10 a-4+c的语法树的构造,无环有向图 (Directed Acyclic Graph,简称dag) 用途:提

14、取表达式中的公共子表达式,以取得目标程序的局部优化。 方法:执行mknode和mkleaf时,检查是否已有相同的结点,若有,则返回相应结点的指针。,5.2.4 表达式的无环有向图,例5.9 表达式 aa*(b-c)+(b-c)*d 的dag,+,*,d,+,*,a,c,b,在分析栈中使用一个附加的域来存放综合属性值。下图为一个带有综合属性值域的分析栈:,state,val,.,X,X.x,Y,.,Y.y,.,.,Z,Z.z,top,5.3 S-属性定义及其自底向上的计算,A b:=f(c1,c2,ck) b是A的综合属性,ci(1 ik)是中符号的属性。综合属性的值是在自底向上的分析过程中,每

15、次归约之前进行计算的。 AXYZ Aa:=f(X x,Y y,Z z),A a,X x Y y Z z,top,state,val,.,.,X,X.x,Y,Y.y,Z,Z.z,state,val,.,.,A,A .a,top,定义式 A .a:=f(X.x, Y.y, Z.z)(抽象)变成valntop:=f(valtop-2,valtop-1,valtop)(具体可执行代码)。在执行代码段之前执行: ntop:=top-r+1 r是句柄的长度 执行代码段后执行: top:=ntop;,产生式 代码段(和图52对比) LEn printf(valntop) E E+T valntop:=val

16、top-2+valtop E T T T*F valntop:=valtop-2*valtop T F F (E) valntop:=valtop-1 F digit,例5.10 用LR分析器实现台式计算器(图516),表5.5 翻译输入3*5+4n所做的移动,输入 state val 使用的产生式,3*5+4n - -,*5+4n 3 3,*5+4n F 3 Fdigit,*5+4n T 3 TF,5+4n T* 3-,+4n T* 5 3-5,+4n T* F 3-5 F digit,+4n T 15 T T*F,+4n E 15 E T,4n E+ 15-,n E+4 15-4,n E+

17、F 15-4 F digit,n E+T 15-4 T F,n E 19 E E+T,En 19 -,L 19 L En,采用自底向上分析,例如LR分析,首先给出S-属性定义,然后,把S-属性定义变成可执行的代码段,这就构成了翻译程序。象一座建筑,语法分析是构架,归约处有一个“挂钩”,语义分析和翻译的代码段(语义子程序)就挂在这个钩子上。这样,随着语法分析的进行,归约前调用相应的语义子程序,完成翻译的任务。,总结,在语法分析过程中进行语义分析和翻译,属 性的计算顺序受到语法分析建立分析树结点顺序的限制。 一种自然的计算属性的顺序是按深度优先访问分析树结点的顺序,它适应多种自底向上和自顶向下的翻

18、译方法。 L-属性定义 可用于按深度优先顺序计算属性值。,5.4 L-属性定义,procedure dfvisit(n:node); begin for n 的每个子结点m(从左至右) do begin 计算m的继承属性; dfvisit(m) end; 计算n的综合属性 end;,深度优先顺序计算属性,定义 一个语法制导定义是L-属性定义,如果AX1X2XnP,其每一个语义规则中的每一个属性都是一个综合属性,或是Xj(1j n)的一个继承属性,这个继承属性仅依赖于 1.产生式中Xj的左边符号X1,X2,Xj-1的属性; 2A的继承属性。 每一个S-属性定义都是L-属性定义。,5.4.1 L-

19、属性定义,图519 非L-属性的语法制导定义,产生式,语义规则,ALM A QR,L.i:=l(A.i) M.i:=m(L.s) A.s:=f(M.s) R.i:=r(A.i) Q.i:=q(R.s) A.s:=f(Q.s),图519的语法制导定义不是L-属性定义 文法符号Q的继承属性依赖于它右边文法符号R的属性,定义 翻译模式是语法制导定义的一种便于翻译的书写形式。其中属性与文法符号相对应,语义规则或语义动作用花括号 括起来,可被插入到产生式右部的任何合适的位置上。 这是一种语法分析和语义动作交错的表示法,它表达在按深度优先遍历分析树的过程中何时执行语义动作。 翻译模式给出了使用语义规则进行

20、计算的顺序。可看成是分析过程中翻译的注释。,5.4.2 翻译模式,将带有+号和-号的中缀表达式翻译成后缀表达式: ETR Raddop T print(addop.lexeme)R1| Tnumprint(num.val) 把语义动作看成终结符号,输入9-5+2,其分析树如图520,当按深度优先遍历它,执行遍历中访问的语义动作,将输出 9 5 - 2 + 它是输入表达式9-5+2的后缀式。,例5.12 一个简单的翻译模式,图5.10 9-5+2的带语义动作的分析树,条件:语法制导定义是L-属性定义 保证语义动作不会引用还没有计算的属性值。 1. 只需要综合属性的情况: 为每一个语义规则建立一个

21、包含赋值的动作,并把这个动作放在相应的产生式右边的末尾。 例如:TT1*F Tval:=T1 val*F val TT1*F Tval:=T1 val*F val,设计翻译模式(根据语法制导定义),2. 既有综合属性又有继承属性 产生式右边的符号的继承属性必须在这个符号以前的动作中计算出来。 一个动作不能引用这个动作右边符号的综合属性。 产生式左边非终结符号的综合属性只有在它所引用的所有属性都计算出来以后才能计算。计算这种属性的动作通常可放在产生式右端的末尾。,设计翻译模式(根据语法制导定义),下面的翻译模式不满足要求: SA1A2 A1in:=1; A2 in:=2 A a print(A

22、in) 例5.13 从L-属性制导定义建立一个满足上面 要求的翻译模式。 使用文法产生的语言是数学排版语言EQN E sub 1val 编排结果,E,1,val,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,SB B B1 B2 B B1 sub B2 B text,产生式,语义规则,图5-22 盒子的大小和高度的语法制导定义,B是盒子; BBB表示两个盒子的并

23、置; BB sub B表示第二个盒子是第一个盒子的下标; ps是继承属性,影响公式的高度;正文的实际高度 等于正文的标准高度乘以B.ps; B的高度由综合属性ht表示 ; texth可根据text的性质查表得到; shrink把B2的尺寸缩小30%; disp把B2向下偏置。,SB.ps:=10 BS.ht:=B.ht B B1.ps:=B.ps B1 B2.ps:=B.ps B2B.ht:=max(B1.ht,B2.ht) B B1.ps:=B.ps B1 sub B2.ps:=shrink(B.ps) B2B.ht:=disp(B1.ht,B2.ht) BtextB.ht:=text.h*

24、B.ps,从图5-22构造的翻译模式,用翻译模式构造自顶向下翻译。 5.5.1 从翻译模式中消除左递归 对于一个翻译模式,若采用自顶向下分析,必须消除左递归和提取左公因子,在改写基本文法时考虑属性值的计算。 例5.14 图524的带左递归的文法的翻译模式被转换成图525的带右递归的文法的翻译模式。,5.5 自顶向下的翻译,EE1+T E val:=E1val+T val E E1-T E val:=E1 val-T val E T E.val:=T val T (E) T val:=E val T num T val:=num val,带左递归的文法的翻译模式,ET Ri:=T val RE

25、val:=R s R TR1i:=R.i+T. val R1R. s:=R1 s R- TR1 i:=R i-Tval R1R s:=R1 s RR s:=R i T( E ) T val:=E.val Tnum T val:=num val,经过转换的带有右递归文法的翻译模式,E val=6,Tval=9,R i=9; R s= 6,9,T val=5,5,R i=4; R s= 6,+,T val=2,R i=6; R s= 6,2,图526 表达式9-5+2的计算,左递归翻译模式 AA1YA.a:=g(A1.a,Y.y) AX A.a:=f(X.x) (5.2) 每一个文法符号都有一个综

26、合属性,用相应的小写字母表示,g和f是任意函数。 消除左递归,文法转换成 AX R RY R| (5.3),关于左递归翻译模式更一般化的讨论,再考虑语义动作,翻译模式变为: AX Ri:=f(X x) R A. a:=R. s RY R1 i:=g(R i,Y y) R1 R s:=R1 s RR s:=R i (5.4) 经过转换的翻译模式与图525中一样,使用R的继承属性i和综合属性s。 (5.2)和(5.4)的结果是一样的, 为什么?,关于左递归翻译模式更一般化的讨论,A a=g(g(f(X x),Y1 y),Y2 y),A a=g(f(X x),Y1 y),A a=f(X x),Y2,

27、Y1,X,(a),输入:XY1Y2,A,Ri=f(X x),R i=g(f(X x),Y1 y),R i=g(g(f(X x),Y1 y),Y2 y),Y2,Y1,X,(b),EE1+T Enptr :=mknode(+,E1 nptr,T nptr) EE1-T Enptr :=mknode(-,E1 nptr,T nptr) ET Enptr :=T nptr 从翻译模式中消除左递归,变成图528的翻译模式。,例5.15 表达式建立语法树的翻译模式,ET Ri:=T nptr R E nptr:=R s R T R1 i:=mknode(+,R i,T nptr) R1 R s:=R1 s

28、 R- T R1 i:=mknode(-,R i,T nptr) R1 R s:=R1 s R R s:=R i T( E ) T nptr:=E nptr Tid T nptr:=mkleaf(id, id entry) Tnum T nptr:=mkleaf(num,num val),使用继承属性构造语法树,E,i,R,s,T,id,R,-,T,num,i,R,T,+,id,id,num 4,id,-,+,to entry for a,to entry for c,nptr,nptr,nptr,算法5.1 预测语法制导翻译器的建立 输入:一个带有适合预测分析的基础文法 的语法制导翻译模式。

29、 输出:一个语法制导翻译器的代码。 方法:在预测分析器中加入语义动作代码。 1AVN,建立一个可递归调用的函数过程A。为A的每一个继承属性都设置一个形式参数,函数的返回值是A的综合属性值。 2.函数过程A的代码(指用符号形式表示的数据和程序)要根据当前的输入符号来决定使用哪一个产生式。,5.5.2 预测翻译器的设计,3与每一个产生式有关的代码,从左到右根椐产生式右部是单词符号、非终结符号还是语义动作,分别是: (a)对于带有综合属性x的单词符号X,x存放在X.x中,Match(X)。 (b)对于BVN,编写一个赋值语句c:= B(b1, b2, ,bk)其中, b1, b2, ,bk是继承属性

30、,c是综合属性。 (c)对于每个动作,动作的代码抄进翻译器中,用代表属性的变量来代替对属性的每一次引用。,5.5.2 预测翻译器的设计,例5.16 : Raddop TR1i:=mknode(addop lexeme, R i, T nptr) R1R.s:=R1.s R R.s:=R.i (55) 递归下降构造语法树 function R(in: syntax-tree-node): syntaX-tree-node; var nptr,i1,s1,s: syntax-tree-node; addoplexeme:char;, IF lookahead=addop THEN /*产生式Rad

31、dop T R*/ addoplexeme:=lexval; match(addop); nptr:=T; i1:=mknode(addoplexeme,in,nptr); s1:=R(i1); s:=s1 ; ELSE s:=in; /*产生式R*/ return (s); ,5.6 L属性的自底向上计算,在自底向上分析的框架中实现L属性定义的方法 它能实现任何基于LL(1)文法的L属性定义 也能实现许多(但不是所有的)基于LR(1) 的L属性定义,5.6.1 删除翻译方案中嵌入的动作 E T R R + T print (+)R1 | T print ()R1 | T num print

32、(num.val),5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.6.1 删除翻译方案中嵌入的动作 E T R R + T print (+)R1 | T print ()R1 | T num print (num.val) 在文法中加入产生的标记非终结符,让每个嵌入动作由不同标记非终结符M代表,并把该动作放在产生式M 的右端,5.6 L属性的自底向上计算,5.6.1 删除翻译方案中嵌入的动作 E T R R + T print (+)R1 | T print ()R1 | T num print (num.val) 在文法中加入产生的标记非终结符,让每个嵌入动作由不同标记非

33、终结符M代表,并把该动作放在产生式M 的右端 E T R R + T M R1 | T N R1 | T num print (num.val) M print (+) N print (),5.6 L属性的自底向上计算,5.6.2 分析栈上的继承属性 属性位置能预测 例 int p, q, r D T L.in = T.type L T int T. type = integer T real T. type = real L L1.in = L.in L1, id addtype (id.entry, L.in ) L id addtype (id.entry, L.in ),5.6 L属

34、性的自底向上计算,5.6 L属性的自底向上计算,属性的位置不能预测 S aAC C.i = A.s S bABC C.i = A.s C c C.s = g(C.i),5.6 L属性的自底向上计算,属性的位置不能预测 S aAC C.i = A.s S bABC C.i = A.s C c C.s = g(C.i) 增加标记非终结符 S aAC C.i = A.s S bABMC M.i = A.s; C.i = M.s C c C.s = g(C.i) M M.s = M.i,5.6 L属性的自底向上计算,5.6.3 模拟继承属性的计算 继承属性是某个综合属性的一个函数 S aAC C.i

35、= f (A.s) C c C.s = g(C.i) 增加标记非终结符,把f(A.s)的计算移到对标记非终结符归约时进行 S aANC N.i = A.s; C.i = N.s N N.s = f (N.i) C c C.s = g(C.i),5.6 L属性的自底向上计算,例 数学排版语言EQN S B.ps = 10 B S.ht = B.ht B B1.ps = B.ps B1 B2.ps = B.ps B2 B.ht = max(B1.ht, B2.ht ) B B1.ps =B.ps B1 sub B2.ps = shrink(B.ps) B2 B.ht = disp (B1.ht,

36、B2.ht ) B text B.ht = text.h B.ps ,5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.6 L属性的自底向上计算,5.7 递归计算,回顾:语法制导定义的实现 分析树方法 边分析边进行属性计算,只能完成L属性计算(忽略规则的方法) 本节介绍先分析后计算的方法,不局限于L属性计算(基于规则的方法) 为每个非终结符构造一个属性计算函数,但是该函数不

37、含语法分析部分 为非终结符的不同综合属性构造不同的函数,5.7 递归计算,5.7.1 自左向右遍历 为B构造一个属性计算函数 S B.ps = 10 B S.ht = B.ht B B1.ps = B.ps B1 B2.ps = B.ps B2 B.ht = max(B1.ht, B2.ht ) B B1.ps =B.ps B1 sub B2.ps = shrink(B.ps) B2 B.ht = disp (B1.ht, B2.ht ) B text B.ht = text.h B.ps ,5.7 递归计算,function B(n, ps); var ps1, ps2, ht1, ht2;

38、 begin case 在结点n的产生式 of B B1 B2: ps1 = ps; ht1 = B(child(n,1), ps1); ps2 = ps; ht2 = B(child(n,2), ps2); return max(ht1, ht2);,B B1.ps = B.ps B1 B2.ps = B.ps B2 B.ht = max(B1.ht, B2.ht ) ,5.7 递归计算,function B(n, ps); var ps1, ps2, ht1, ht2; begin case 在结点n的产生式 of B B1 sub B2: ps1 = ps; ht1 = B(child(

39、n,1), ps1); ps2 = shrink(ps); ht2 = B(child(n,3), ps2); return disp(ht1, ht2);,B B1.ps = B.ps B1 sub B2.ps = shrink(B.ps) B2B.ht = disp (B1.ht, B2.ht ) ,5.7 递归计算,function B(n, ps); var ps1, ps2, ht1, ht2; begin case 在结点n的产生式 of B text: return ps text.h; default: error end,B text B.ht = text.h B.ps ,

40、5.7 递归计算,5.7.2 其它遍历方法 按所需次序访问结点的子结点,可用于非L属性定义 A LM L.i = l(A.i); M.i = m(L.s); A.s = f (M.s) A QR R.i = r(A.i); Q.i = q(R.s); A.s = f (Q.s),5.7 递归计算,A LM: /* 从左到右的次序 */ li = l(ai); ls = L(child(n,1), li); mi = m(ls); ms = M(child(n,2), mi); return f (ms);,5.7 递归计算,A QR: /* 从右到左的次序 */ ri = r(ai); rs

41、= R(child(n,2), ri); qi = q(rs); qs = Q(child(n,1), qi); return f (qs);,5.7 递归计算,5.7.3 多次遍历 S E E.i = g(E.s); S.r = E.t E E1E2 E.s = fs(E1.s, E2.s); E1.i = fi1(E.i); E2.i = fi2(E.i); E.t = ft (E1.t, E2.t) E id E.s = id.s; E.t = h(E.i),5.7 递归计算,综合属性t不可能和s在同一遍扫描中完成计算,5.7 递归计算,function Sr(n); begin s =

42、 Es(child(n,1); i = g(s); t = Et(child(n,1), i); return t end;,5.7 递归计算,function Es(n); | function Et(n, i); begin | begin case 在结点n的产生式 of | case 在结点n的产生式 of E E1 E2: | E E1 E2: s1 = Es(child(n,1);| i1= fi1(i); s2 = Es(child(n,2);| t1 = Et(child(n,1), i1); return fs(s1, s2); | i2 = fi2(i); E id: |

43、t2 = Et(child(n,2), i2); return id.s; | return ft(t1, t2); default: | E id: error | return h(i); end | default: end; | error | end | end;,本章要点,语义规则的两种描述方法:语法制导的定义和翻译方案 设计简单问题的语法制导定义和翻译方案,这是本章的重点和难点 语义规则的三种计算方法:分析树方法、基于规则的方法和忽略规则的方法 S属性的自底向上计算(边分析边计算) L属性的自上而下计算(边分析边计算) L属性的自底向上计算(边分析边计算) 递归计算(先分析后计算),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1