xt05答案.docx
《xt05答案.docx》由会员分享,可在线阅读,更多相关《xt05答案.docx(21页珍藏版)》请在冰豆网上搜索。
![xt05答案.docx](https://file1.bdocx.com/fileroot1/2023-5/16/ce2c80c5-94dd-46d3-b24f-ef7ef852b36f/ce2c80c5-94dd-46d3-b24f-ef7ef852b36f1.gif)
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,T.pmark,F.pmark,属性变量,若为true,表示E,T,F的表达式中左端为‘(’,右端是‘)’。
语法制导定义如下:
产生式
语义规则
E->E1+T
if(T.pmark==true)
THENE.expr=E1.expr||'+'||deletep(T.expr)
ELSEE.expr:
=E1.expr||'+'||T.expr;
E.add:
=true;
E.pmark:
=false;
E->T
if(T.pmark==true)
THENE.expr:
=deletep(T.expr)
ELSEE.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)
THENBEGIN
F.expr:
=E.expr;
F.add:
=false;
F.pmark:
=false;
END
ELSEBEGIN
F.expr:
='('||E.expr||')';
F.add:
=true;
F.pmark:
=true;
END;
F->id
F.expr:
=id.lexval;
F.add:
=false;
F.pmark:
=false;
练习5.4
解答:
(a)语法制导定义如下:
产生式
语义规则
E->E1+T
if(E1.type==int)AND(T.type==int)
THENE.type:
=int
ELSEE.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)
THENE.type:
=int
ELSEBEGIN
E.type:
=real;
if(E1.type==int)AND(T.type==real)
THENE1.pf:
='inttoreal'||E1.pf
ELSEif(E1.type==real)AND(T.type==int)
THENT.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->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.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
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;
练习5.6
解答:
产生式
语义规则
D->D1,id
D.type:
=D1.type;
addtype(id.entry,D1.type);
D->Tid
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)
THENR1.i:
=int
ELSER1.i:
=real;
R.s:
=R1.s;
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)
THENR1.itype:
=int
ELSEBEGIN
R1.itype:
=real;
if(R.itype==real)AND(T.type==int)
THENT.pf:
='inttoreal'||T.pf
ELSEif(R.itype==int)AND(T.type==real)
THENR.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(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))
thenerror
elseenter(id.name,L.in)}
L->id{if(lookup(id.name))
thenerror
elseenter(id.name,L.in)}
T->int{T.type:
=int}
T->real{T.type:
=real}
练习5.9
解答:
(a)翻译模式如下:
D->idL{addtype(id.entry,L.type)}
L->,idL1{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;
VARL.type:
(integer,real);
id.entry:
^id-entry;
BEGIN
id.entry:
=id.lexval;
match(id);
L.type:
=L;
addtype(id.entry,L.type)
END;
FUNCTIONL:
(integer,real);
VARL.type,L1.type:
(integer,real);
id.entry:
^id-entry;
BEGIN
if(lookahead==',')
THENBEGIN
match(',');
match(id);
id.entry:
=id.lexval;
L1.type:
=L;
L.type:
=L1.type;
addtype(id.entry,L.type);
END
ELSEBEGIN
match(':
');
L.type:
=T;
END;
return(L.type);
END;
FUNCTIONT:
(integer,real);
VART.type:
(integer,real);
BEGIN
if(lookahead=='integer')
THENBEGIN
match(integer);
T.type:
=id.lexval
END
ELSE
if(lookahead=='real')
THENBEGIN
match(real);
T.type:
=id.lexval;
END;
ELSEERROR;
return(T.type);
END;
练习5.10
解答:
(a)对于F1subF2subF3,其最左推导和分析树如下:
S=>L
=>B
=>BsubF3
=>BsubF2subF3
=>F1subF2SubF3
显然,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->B1subF
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.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}
{L}{F.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:
=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|ε
继承属性的计算如下图所示:
当识别出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)}