练习5.1解答:输入(4*7+1)*2n,带注释的分析树如下:练习5.2解答: (1)根据表5.3中的语法制导定义建立表达式((a)+(b))的分析树和语法树(2)根据图5.17的翻译模式构造((a)+(b))的分析树和语法树练习5.3解答:设置下面的函数和属性:expr1||expr2:把表达式expr2拼写在表达式expr1后面。
deletep(expr):去掉表达式expr左端的‘(’和右端的‘)’。
E.expr,T.expr,F.expr:属性变量,分别表示E,T,F的表达式。
E.add,T.add,F.add,属性变量,若为true,则表示其表达式中外层有‘+’号,否则无‘+’号。
E.pmark,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.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 BEGINF.expr:=E.expr;F.add:=false;F.pmark:=false;ENDELSE BEGINF.expr:='('||E.expr||')';F.add:=true;F.pmark:=true;END;F -> id F.expr:=id.lexval;F.add:=false;F.pmark:=false;练习5.4解答: (1)语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int) THEN E.type:=intELSE E.type:=real;E -> T E.type:=T.type;T -> num T.type:=int;T -> num.num T.type:=real;(2)设E.pf和T.pf分别是E和T的前缀形式,||是两个字符串的连接,语法制导定义如下:产生式语义规则E -> E1+T if(E1.type==int) AND (T.type==int)THEN E.type:=intELSE BEGINE.type:=real;if(E1.type==int) AND (T.type==real)THEN E1.pf:='inttoreal'||E1.pfELSE if(E1.type==real)AND(T.type==int)THEN T.pf:='inttoreal'||T.pfEND;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.numT.type:=real; T.pf:=real.lexval;练习5.5解答: (1)用综合属性决定s.val的语法制导定义:产生式语义规则S -> L S.val:=L.val;S ->L1.L2S.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的因子。
(2)分析:设B.c是B的综合属性,是B产生的位对最终值的贡献。
要求出B.c,必须求出B产生位的权,设B.i。
B.i的求法请参看下面的图示:另外,设L.fi为继承因子,L.fs为综合因子,语法制导定义如下:产生式语义规则S -> L L.i:=1; L.fi:=2; L.fs:=1; S.val:=L.val;S -> L1.L2L1.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 | LL -> LB | BR -> RB | BB -> 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;练习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解答:(1)产生式语义规则E -> TR R.i:=T.type; E.type:=R.s;R -> +TR1if(R.i==int) AND (T.type==int) THEN R1.i:=intELSE R1.i:=real;R.s:=R1.s;R -> εR.s:=R.i;T ->num.numT.type:=real;T -> num T.type:=int;(2)产生式语义规则E -> TR R.itype:=T.type; R.ipf:=T.pf;E.pf:=R.spf; E.type:=R.stype;R -> +TR1if(R.itype==int) AND (T.type==int)THEN R1.itype:=intELSE BEGINR1.itype:=real;if(R.itype==real) AND (T.type==int)THEN T.pf:='inttoreal'||T.pfELSE if(R.itype==int)AND(T.type==real)THEN R.ipf:='inttoreal'||R.ipfEND;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.numT.type:=real; T.pf:=real.lexval;注:R.ipf是R的继承属性,是它的前缀表示。
R.spf是R的综合属性,是它的前缀表示。
练习5.8解答:设计两个函数lookup(name)和enter(name,type),lookup(name)查找符号表,若查到,则返回name在符号表中的地址;否则返回NULL。
enter(name,type)在符号表中建立name的符号表项,并填写上name的类型type。
翻译模式如下:D -> T {L.in:=T.type} LL -> {L1.in:=L.in}L1,id {if(lookup())then errorelse enter(,L.in)}L -> id {if(lookup())then errorelse enter(,L.in)}T -> int {T.type:=int}T -> real {T.type:=real}练习5.9解答:(1) 翻译模式如下: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}(2) 预测翻译程序由如下过程组成:PROCEDURE D;V AR L.type:(integer,real);id.entry:^id-entry;BEGINid.entry:=id.lexval;match(id);L.type:=L;addtype(id.entry,L.type)END;FUNCTION L:(integer,real);V AR L.type,L1.type:(integer,real);id.entry:^id-entry;BEGINif(lookahead==',')THEN BEGINmatch(',');match(id);id.entry:=id.lexval;L1.type:=L;L.type:=L1.type;addtype(id.entry,L.type);ENDELSE BEGINmatch(':');L.type:=T;END;return(L.type);END;FUNCTION T:(integer,real);V AR T.type:(integer,real);BEGINif(lookahead=='integer')THEN BEGINmatch(integer);T.type:=id.lexvalENDELSEif(lookahead=='real')THEN BEGINmatch(real);T.type:=id.lexval;ENDELSE ERROR;return (T.type);END;练习5.10解答:(1) 对于F1 sub F2 sub F3,其最左推导和分析树如下:S => L=> B=> B sub F3=> B sub F2subF3=> F1 sub F2 SubF3显然,F3.ps:=shrink(F2.ps);F2.ps:=shrink(F1.ps);为此,为B设一个综合属性B.pt,其值等于其下标F的继承属性F.ps。