收藏 分享(赏)

编译原理答案 第五章.doc

上传人:dzzj200808 文档编号:2258054 上传时间:2018-09-07 格式:DOC 页数:15 大小:204KB
下载 相关 举报
编译原理答案   第五章.doc_第1页
第1页 / 共15页
编译原理答案   第五章.doc_第2页
第2页 / 共15页
编译原理答案   第五章.doc_第3页
第3页 / 共15页
编译原理答案   第五章.doc_第4页
第4页 / 共15页
编译原理答案   第五章.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、练习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.pmar

2、k,T.pmark,F.pmark,属性变量,若为 true,表示 E,T,F 的表达式中左端为 (,右端是) 。语法制导定义如下:产生式 语义规则E - E1 +Tif(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 - Tif(T.pmark=true) THEN E.expr:=deletep(T.expr)ELSE E.expr:=T.expr;E.add:=T.add;E.pmark:=false;T - T1*F

3、T.expr:=T1.expr|*|F.expr; T.add:=false;T.pmark:=false;T - FT.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 - idF.expr:=id.lexval; F.add:=false;F.pmark:=false;练习5.

4、4解答: (1)语法制导定义如下:产生式 语义规则E - E1+Tif(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+Tif(E1.type=int) AND (T.type=int) THEN E.type:=intELSE BEGINE.type

5、:=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.num T.type:=real; T.pf:=real.lexval;练习5.5解答: (1)用综合属性决定 s.val 的语法制导定义:

6、产生式 语义规则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 为综合因子,语法制导定

7、义如下:产生式 语义规则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 - L1BL1.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;若把文法改写成如下形式,则语法制导定义会更清楚:

8、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.

9、i;练习5.6解答: 产生式 语义规则D - D1,idD.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:

10、=R.i;T - num.num T.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=

11、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 - T.type:=real; T.pf:=real.lexval;num.num注: R.ipf 是 R 的继承属性,是它的前缀表示。R.spf 是 R 的综合属性,是它的前缀表示。练习5.8解答:设计两个函数 lookup(name)和 enter(name,typ

12、e),lookup(name)查找符号表,若查到,则返回 name 在符号表中的地址;否则返回 NULL。enter(name,type)在符号表中建立 name 的符号表项,并填写上 name 的类型 type。翻译模式如下:D - T L.in:=T.type LL - L1.in:=L.inL1,id if(lookup(id.name)then errorelse enter(id.name,L.in)L - id if(lookup(id.name)then errorelse enter(id.name,L.in)T - int T.type:=intT - real T.type

13、:=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.typeT - integer T.type:=integerT - real T.type:=real(2) 预测翻译程序由如下过程组成:PROCEDURE D;VAR L.type:(integer,real);id.entry:id-entry;BEGINid.entry:=id.lexval;match(id);L.type:=L;a

14、ddtype(id.entry,L.type)END;FUNCTION L:(integer,real);VAR 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:(intege

15、r,real);VAR T.type:(integer,real);BEGINif(lookahead=integer)THEN BEGINmatch(integer);T.type:=id.lexvalENDELSE if(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 F2 sub F3= F1 sub F2 Sub

16、 F3显然,F 3.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 sub FB1.ps:=B.ps; F.ps:=shrink(B1.pt); B.ht:=disp(B1.ht,F.ht);B.pt:=F.ps;

17、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(2) 翻译模式如下:S - L.ps:=10L S.ht:=L.htL - B.ps:=L.psB L.ht:=B.htL - L1.ps:=L.psL1 B.ps:=L.psB L.ht:=max(L1.ht,B.ht)B - B1.ps:=B.psB1sub F.ps:=shrink(B1.pt)F B.ht:=disp(B1.ht,F.ht);B.pt:=F.psB - F.ps:=B.psF B

18、.ht:=F.ht; B.pt:=B.psF - L.ps:=F.psLF.ht:=L.htF - text F.ht:=text.h*F.ps 练习5.11解答:(1) 假设基础文法含左递归的翻译模式如下:A - A1.i:=A.iA1 Y.i:=A.iY A.a:=g(A1.a,Y.y)A - X.i:=A.iX A.a:=f(X.x)消除基础文法左递归后的翻译模式如下: A - X.i:=A.iX R.i:=f(X.x); R.yi:=A.iR A.a:=R.sR - Y.i:=R.yiY R1.i:=g(R.i,Y.y); R1.yi:=R.yiR1 R.s:=R1.sR - R.s:

19、=R.i属性 R.yi 用于传递 A.i 给 Y。(2) 设基础文法含左递归的翻译模式如下:A A 1.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)考虑 XY1Y2Y3,其继承属性的计算如下:消除基础文法中的左递归后,基础文法为:A - XRR - YR | 继承属性的计算如下图所示: 当识别出 X 后,并不能计算出 X 的继承属性,因而,也就无法计算有关 X 的其他属性。只好把 X 的源表示或中间表示作为继承传给 R,继续沿 R 传下去,然后再作为综合属性传回来。直到能计算出 X.i,再对 X

20、 的成分进行翻译。Y1,Y2,Y3的翻译思想和 X 类似,具体的翻译模式省略。练习5.12解答:S - L.ps:=10; L.iht:=0L S.ht:=L.htL - B.ps:=L.psB L.ht:=max(L.iht,B.ht)L - B.ps:=L.psB L1.iht:=max(L.iht,B.ht); L1.ps:=L.psL1 L.ht:=L1.htB - F.ps:=B.psFsub B1.ps:=shrink(B.ps)B1 B.ht:=disp(F.ht,B1.ht)B - F.ps:=B.psF B.ht:=F.htF - L.ps:=F.psL F.ht:=L.ht

21、F - text F.ht:=text.h*F.ps练习5.13解答: (1)栈 输入 动作$ abbb$ 初始$M abbb$ 规约 M - $MM abbb$ 规约 M - $MMM abbb$ 规约 M - $MMMa bbb$ 移进$MMML bbb$ 规约 L - a$MMMLb bb$ 移进$MML bb$ 规约 L - MLb$MMLb b$ 移进$ML b$ 规约 L - MLb$MLb $ 移进$L $ 规约 L - MLb接受(2) 构造文法的 LR(1)项目的识别文法活前缀的 DFA:在项目集 I0,I2,I2中,存在移进- 规约冲突,因此,它不是 LR(1)的。练习5.

22、14解答:(1) 把表5.10的语法制导定义改写成下面的翻译模式:S - L B.ps:=L.sB S.ht:=B.htL - L.s:=10B - B1.ps:=B.psB1 M.i:=B.psM B2.ps:=M.sB2 B.ht:=max(B1.ht,B2.ht)M - M.s:=M.iB - B1.ps:=B.psB1sub N.i:=B.psN B2.ps:=N.sB2 B.ht:=disp(B1.ht,B2.ht)B - text B.ht:=text.h*B.psN - N.s:=shrink(N.i)(b) 设一个栈 ps,管理继承属性 B.ps 的值。栈的三个操作为push(

23、ps,值),pop(ps),top(ps).翻译模式如下:S - L B.ps:=top(ps)B S.ht:=B.htL - push(ps,10)B - B1.ps:=top(ps)B1 B2.ps:=top(ps)B2 B.ht:=max(B1.ht,B2.ht)B - B1.ps:=top(ps)B1subN (B2.ps:=top(ps)B2 B.ht:=disp(B1.ht,B2.ht); pop(ps)B - text B.ht:=text.h*B.psN - push(ps,shrink(top(ps)练习5.15解答:A B C D 练习5.16解答:(1) FALSE (2

24、) TRUE (3) TRUE (4) FALSE (5) TRUE (6) FALSE练习5.17解答:atype: ARRAY(09, ARRAY(-1010, integer);cell: RECORD(a integer) (binteger);pcell: POINTER(cell);或 : POINTER(RECORD(a integer) (b integer);foo: ARRAY(1100, cell);或 : ARRAY(1100, RECORD(a integer) (b integer);bar: integer cellpcell;或 : integer cellPO

25、INTER(RECORD(ainteger) (binteger);练习5.18解答:D - id:T addtype(id.entry,T.type)T - char T.type:=charT - integer T.type:=integerT - list of T1 T.type:=list(T1.type)E - num E.type:=integerE - id E.type:=lookup(id.entry)E - Literal E.type:=charE - (L) E.type:=list(L.type)L - E,L1 L.type:=IF (E.type=L1.typ

26、e)THEN E.typeELSE type_errorL - E L.type:=E.type练习5.19解答:(1)S - id:=E S.type:= IF id.type=E.typeTHEN E.typeELSE type_error;S.val:= IF id.type=E.typeTHEN E.valELSE val_errorS - IF E THEN S1 S.type:= IF E.type=booleanTHEN S1.typeELSE type_error;S.val:= IF E.type=booleanTHEN S1.valELSE val_errorS - WHI

27、LE E DO S1 S.type:= IF E.type=booleanTHEN S1.typeELSE type_error;S.val:= IF E.type=booleanTHEN S1.valELSE val_errorS - S1;S2 S.type:=S2.type;S.val:=S2.val(2)E - E1 AND E2 E.type:= IF(E1.type=boolean)AND(E2.type=boolean)THEN booleanELSE type_errorE - E1 OR E2 E.type:= IF(E1.type=boolean)AND(E2.type=boolean)THEN booleanELSE type_errorE - NOT E1 E.type:= IF(E1.type=boolean)THEN booleanELSE type_errorE - E1 op E2 E.type:= IF(E1.type=E2.type)THEN booleanELSE type_error注:op 为关系运算符,包括 =, , , =。练习5.20解答:(1)(2)(4)结构等价,无名字等价。

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

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报