1、xt05答案练习5.1 解答:输入(4*7+1)*2n,带注释的分析树如下:练习5.2 解答:(a)根据表5.3中的语法制导定义建立表达式(a)+(b)的分析树和语法树 (b)根据图5.17的翻译模式构造(a)+(b)的分析树和语法树练习5.3 解答:设置下面的函数和属性:expr1|expr2:把表达式expr2拼写在表达式expr1后面。deletp(expr):去掉表达式expr左端的(和右端的)。E.expr,T.expr,F.expr:属性变量,分别表示E,T,F的表达式。E.add,T.add,F.add,属性变量,若为true,则表示其表达式中外层有号,否则无号。E.pmark,
2、T.pmark,F.pmark,属性变量,若为true,表示E,T,F的表达式中左端为(,右端是)。语法制导定义如下:产生式语义规则E - E1 +T if(T.pmark=true) THEN E.expr=E1.expr|+|deletep(T.expr) ELSE E.expr:=E1.expr|+|T.expr;E.add:=true;E.pmark:=false;E - T if(T.pmark=true) THEN E.expr:=deletep(T.expr) ELSE E.expr:=T.expr;E.add:=T.add;E.pmark:=false; T - T1*F T.
3、expr:=T1.expr|*|F.expr; T.add:=false;T.pmark:=false;T - F T.expr:=F.expr; T.add:=F.add;T.pmark:=F.pmark; F - (E) if(E.add=false) THEN BEGIN F.expr:=E.expr; F.add:=false; F.pmark:=false; END ELSE BEGIN F.expr:=(|E.expr|); F.add:=true; F.pmark:=true; END; F - id F.expr:=id.lexval; F.add:=false;F.pmark
4、:=false; 练习5.4 解答: (a)语法制导定义如下:产生式语义规则E - E1+T if(E1.type=int) AND (T.type=int) THEN E.type:=int ELSE E.type:=real; E - T E.type:=T.type; T - num T.type:=int; T - num.num T.type:=real; (b)语法制导定义如下:产生式语义规则E - E1+T if(E1.type=int) AND (T.type=int) THEN E.type:=int ELSE BEGIN E.type:=real; if(E1.type=i
5、nt) AND (T.type=real) THEN E1.pf:=inttoreal|E1.pf ELSE if(E1.type=real)AND(T.type=int) THEN T.pf:=inttoreal|T.pf END; E.pf:=+|E1.pf|T.pf; E - T E.type:=T.type; E.pf:=T.pf; T - num T.type:=int; T.pf:=int.lexval; T - num.num T.type:=real; T.pf:=real.lexval; 练习5.5解答: (a)用综合属性决定s.val的语法制导定义:产生式语义规则 S -
6、L S.val:=L.val; S - L1.L2 S.val:=L1.val+L2.val*L2.p; L - B L.val:=B.val; L.p:=2-1; L - L1B L.val:=L1.val*2+B.val; L.p:=L.p*2-1; B - 0 B.val:=0; B - 1 B.val:=1; 注:L.p表示恢复L.val的因子。 (b)分析:设B.c是B的综合属性,是B产生的位对最终值的贡献。要求出B.c,必须求出B产生位的 权,设B.i。B.i的求法请参看下面的图示: 另外,设L.fi为继承因子,L.fs为综合因子,语法制导定义如下:产生式语义规则 S - L L.
7、i:=1; L.fi:=2; L.fs:=1; S.val:=L.val; S - L1.L2 L1.i=1; L1.fi=2; L1.fs:=1; L2.i=2-1; L2.fi=1; L2.fs:=2-1;S.val:=L1.val+L2.val; L - B L.s:=L.i; B.i:=L.s; L.val:=B.c; L - L1B L1.i:=L.i*L1.fi; L.s:=L1.s*L1.fs;B.i:=L.s;L.val:=L1.val+B.c; B - 0 B.c:=0; B - 1 B.c:=B.i; 若把文法改写成如下形式,则语法制导定义会更清楚: S - L.R | L
8、 L - LB | B R - Rb | B B - 0 | 1产生式语义规则 S - L L.i:=1; S.val:=L.val; S - L.R L.i=1; R.i=2-1; S.val:=L.val+R.val; L - L1B B.i:=L.i; L1.i:=L.i*2; L.val:=L1.val+B.c; L - B B.i:=L.i; L.val:=B.c; R - R1B R1.i:=R.i; R.s:=R1.s*2-1; B.i:=R.s; R - B R.s:=R.i; B.i:=R.s; R.val:=B.c; B - 0 B.c:=0; B - 1 B.c:=B.i
9、; 练习5.6 解答:产生式语义规则 D - D1,id D.type:=D1.type; addtype(id.entry,D1.type); D - T id D.type:=T.type; addtype(id.entry,T.type); T - int T.type:=int; T - real T.type:=real; 练习5.7 解答: (a)产生式语义规则 E - TR R.i:=T.type; E.type:=R.s; R - +TR1 if(R.i=int) AND (T.type=int) THEN R1.i:=int ELSE R1.i:=real;R.s:=R1.s
10、; R - R.s:=R.i; T - num.num T.type:=real; T - num T.type:=int; (b)产生式语义规则 E - TR R.itype:=T.type; R.ipf:=T.pf; E.pf:=R.spf; E.type:=R.stype; R - +TR1 if(R.itype=int) AND (T.type=int) THEN R1.itype:=int ELSE BEGIN R1.itype:=real; if(R.itype=real) AND (T.type=int) THEN T.pf:=inttoreal|T.pf ELSE if(R.i
11、type=int)AND(T.type=real) THEN R.ipf:=inttoreal|R.if END;R1.ipf:=+|R.ipf|T.pf;R.stype:=R1.stype; R.spf:=R1.spf; R - R.stype:=R.itype; R.spf:=R.ipf; T - num T.type:=int; T.pf:=int.lexval; T - num.num T.type:=real; T.pf:=real.lexval; 注: R.ipf是R的继承属性,是它的前缀表示。 R.spf是R的综合属性,是它的前缀表示。练习5.8 解答:设计两个函数lookup(
12、name)和enter(name,type),lookup(name)查找符号表,若查到,则返回name在符号表中的地址;否则返回NULL。enter(name,type)在符号表中建立name的符号表项,并填写上name的类型type。翻译模式如下: D - T L.in:=T.type L L - L1.in:=L.in L1,id if(lookup(id.name) then error else enter(id.name,L.in) L - id if(lookup(id.name) then error else enter(id.name,L.in) T - int T.typ
13、e:=int T - real T.type:=real练习5.9 解答:(a) 翻译模式如下: D - id L addtype(id.entry,L.type) L - , id L1 L.type:=L1.type; addtype(id.entry,L.type) L - : T L.type:=T.type T - integer T.type:=integer T - real T.type:=real(b) 预测翻译程序由如下过程组成: PROCEDURE D; VAR L.type:(integer,real); id.entry:id-entry; BEGIN id.entr
14、y:=id.lexval; match(id); L.type:=L; addtype(id.entry,L.type) END; FUNCTION L:(integer,real); VAR L.type,L1.type:(integer,real); id.entry:id-entry; BEGIN if(lookahead=,) THEN BEGIN match(,); match(id); id.entry:=id.lexval; L1.type:=L; L.type:=L1.type; addtype(id.entry,L.type); END ELSE BEGIN match(:)
15、; L.type:=T; END; return(L.type); END; FUNCTION T:(integer,real); VAR T.type:(integer,real); BEGIN if(lookahead=integer) THEN BEGIN match(integer); T.type:=id.lexval END ELSE if(lookahead=real) THEN BEGIN match(real); T.type:=id.lexval; END; ELSE ERROR; return (T.type); END; 练习5.10 解答:(a) 对于F1 sub F
16、2 sub F3,其最左推导和分析树如下: S = L = B = B sub F3 = B sub F2 sub F3 = F1 sub F2 Sub F3 显然,F3.ps:=shrink(F2.ps); F2.ps:=shrink(F1.ps); 为此,为B设一个综合属性B.pt,其值等于其下标F的继承属性F.ps。语法制导定义如下:产生式语义规则 S - L L.ps:=10; S.ht:=L.ht; L - B B.ps:=L.ps; L.ht:=B.ht; L - L1B L1.ps:=L.ps; B.ps:=L.ps; L.ht:=max(L1.ht,B.ht); B - B1
17、sub F B1.ps:=B.ps; F.ps:=shrink(B1.pt); B.ht:=disp(B1.ht,F.ht);B.pt:=F.ps; B - F F.ps:=B.ps; B.ht:=F.ht; B.pt:=B.ps; F - L L.ps:=F.ps; F.ht:=L.ht; F - text F.ht:=text.h*F.ps (b) 翻译模式如下: S - L.ps:=10 L S.ht:=L.ht L - B.ps:=L.ps B L.ht:=B.ht L - L1.ps:=L.ps L1 B.ps:=L.ps B L.ht:=max(L1.ht,B.ht) B - B1
18、.ps:=B.ps B1 sub F.ps:=shrink(B1.pt) F B.ht:=disp(B1.ht,F.ht); B.pt:=F.ps B - F.ps:=B.ps F B.ht:=F.ht; B.pt:=B.ps F - L.ps:=F.ps LF.ht:=L.ht F - text F.ht:=text.h*F.ps 练习5.11 解答:(a) 假设基础文法含左递归的翻译模式如下: A - A1.i:=A.i A1 Y.i:=A.i Y A.a:=g(A1.a,Y.y) A - X.i:=A.i X A.a:=f(X.x) 消除基础文法左递归后的翻译模式如下: A - X.i:
19、=A.i X R.i:=f(X.x); R.yi:=A.i R A.a:=R.s R - Y.i:=R.yi Y R1.i:=g(R.i,Y.y); R1.yi:=R.yi R1 R.s:=R1.s R - R.s:=R.i 属性R.yi用于传递A.i给Y。(b) 设基础文法含左递归的翻译模式如下: A A1.i:=h1(A.i) A1 y.i:=h2(A.i) Y A.a:=g(A1.a,Y.y) A - X.i:=h3(A.i) X A.a:=f(X.x) 考虑XY1Y2Y1,其继承属性的计算如下: 消除基础文法中的左递归后,基础文法为: A - XR R - YR | 继承属性的计算如下
20、图所示:当识别出X后,并不能计算出X的继承属性,因而,也就无法计算有关X的其他属性。只好把X的源表示或中间表示作为继承传给R,继续沿R传下去,然后再作为综合属性传回来。直到能计算出X.i,再对X的成分进行翻译。Y1,Y2,Y3的翻译思想和X类似,具体的翻译模式省略。练习5.12 解答: S - L.ps:=10; L.iht:=0 L S.ht:=L.ht L - B.ps:=L.ps B L.ht:=max(L.iht,B.ht) L - B.ps:=L.ps B L1.iht:=max(L.iht,B.ht); L1.ps:=L.ps L1 L.ht:=L1.ht B - F.ps:=B.ps F sub B1.ps:=shrink(B.ps) B1 B.ht:=disp(F.ht,B1.ht)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1