编译原理附标准答案五

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

练习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 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:=false;

练习5.4

解答: (1)语法制导定义如下:

产生式语义规则

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;

(2)设E.pf和T.pf分别是E和T的前缀形式,||是两个字符串的连接,语法制导定义如下:

产生式语义规则

E -> E1+T if(E1.type==int) AND (T.type==int)

THEN E.type:=int

ELSE BEGIN

E.type:=real;

if(E1.type==int) 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

解答: (1)用综合属性决定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的因子。

(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 | 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;

相关文档
最新文档