计算机编译原理课后习题及答案详细解析(8)

2019-05-27 17:23

[答案]

2、 令

S.val为下面的文法由S生成的二进制数的值(如,对于输入101.101,S.val=5.625);

S→L.L | L L→LB | B B→0 | 1 [答案]

val为综合属性,代表值属性

语法制导定义

产生式 语义规则 S.val:=L.val+L.val/2S.val:=L.val 12L2.length.L2 S?L S?L1 L?L1B L.val:=L.val*2+B.val 1L.length:=L1.length+1 L?B B?0 B?1 L.val:=B.val L.length:=1 B.val:=0 B.val:=1 3、下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果为整数,否则为

E→E+T | T T→num.num | num 给出语法制导定义确定每个子表达式的类型。 [答案]

设type是综合属性,代表各非终结符的“类型”属性

产生式 E?E1语义规则 IF (E.type=integer) and (T.type=integer) THEN E.type:=integer ELSE E.type:=real E.type:=T.type T.type:=real T.type:=integer 1+T E?T T?num.num T?num

4、利用下列文法 E→E+T | T T→num.num | num 把表达式翻译成前缀形式,并且决定类型。试用一元运算符inttoreal[答案]

把整型值转换为相等的实型值,以使得前缀表

为综合属性,代表各非终结符的代码属性

type为综合属性,代表各非终结符的类型属性 inttoreal把整型值转换为相等的实型值 vtochar将数值转换为字符串

语法制导定义

产生式 S->E E?E1+T 语义规则 print E.code IF (E1.type=integer) and (T.type=integer) THEN begin E.type:=integer E.code='+'||E1.code ||T.code; end ELSE begin E.type:=real IF E1.type=integer THEN begin E1.type:=real E1.val:=inttoreal(E1.val) 设code

E1.code=vtochar(E1.val) end IF T.type:=integer THEN begin T.type:=real T.val:=inttoreal(T.val) T.code=vtochar(T.val) end E.code='+'||E1.code||T.code; End E?T E.type:=T.type E.val:=T.val E.code=vtochar(E.val) T?num.num T.type:=real T.val:=num.num.lexval T.code=vtochar(T.val) T.type:=integer T.val:=num.lexva T.code=vtochar(T.val) T?num 5、请按语法制导的定义,将后缀表达式翻译成中缀表达式。注意,不允许出现冗余括号,后续表达式的文法如下: E→EE+ E→EE* E→id [答案]

产生式 S→E E→E1E2+ E→E1E2* 语义规则 print E.code E.code=E1.code||'+'||E2.code; E.op='+' IF E1.op='+' AND E2.op='+' THEN E.code=\1.code||')'||'*'||'('||E2.code||')'; E→id

ELSE IF E1.op='+'THEN E.code=\1.code||')'||'*'||E2.code; ELSE IF E2.op='+'THEN E.code=E1.code||'*'||'('||E2.code||')'; ELSE E.code=E1.code||'*'||E2.code||; E.code:=id.lexeme;

6、有文法: S→(L)|a L→L,S|S

给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号的个数。如对于句子[答案]

拓展文法:加入新开始符号S'和产生式S'→S

设num为综合属性,代表值属性

语法制导定义 产生式 S'→S S→(L) S→a L→L1,S L→S

语义规则 print(S.num) S.num:=L.num+1 S.num:=0 L.num:=L1.num+S.num L.num:=S.num

7、假设变量的说明是由下列文法生成的:

D→i L L→,i L | :T T→integer | real 1)建立一个语法制导定义,把每一个标志符的类型加在符号表中 2)为1)构造一个预翻译程序 [答案]

1)type为综合属性,代表类型属性,

函数addtype实现向符号表中i对应项填类型信息。 语法制导定义 产生式 D→i L L→,i L L→:T T→integer T→real 1语义动作 D.Type:=L.Type addtype(i.entry,D.type) L.Type:=L.Type addtype(i.entry, L.type) L.type:=T.type T.type:=integer T.type:=real 1b) 采用递归下降分析法编写预翻译程序: Procedure D; begin

if lookahead=id then begin

match(id); D.type=L;

addtype(id.entry,D.type) end

else error end Function L: DataType; begin

if lookahead=’,’ then begin

match(‘,’);

if lookahead=id then begin

match(id); L.Type=L;

addtype(id.entry,L.type); return(L.type) end


计算机编译原理课后习题及答案详细解析(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:微生物大纲

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: