第08章 语法制导翻译和中间代码生成(2)

2019-01-10 12:39

《编译原理》课后习题答案第八章

采用语法制导翻译思想,表达式 E 的“值”的描述如下: 产生式 语义动作 (0) S′→E (1) E→E1+E2 (2) E→E1*E2 (3) E→(E1)

{print E.VAL} {E.VAL∶=E1.VAL+E2.VAL} {E.VAL∶=E1.VAL*E2.VAL} {E.VAL∶=E1.VAL}

(4) E→n {E.VAL∶=n.LEXVAL}

假如终结符 n 可以是整数或实数,算符+和*的运算对象类型一致,语义处理增加“类 型匹配检查”,请给出相应的语义描述。 答案:

(0) S′→E { if error≠1 then print E.VAL}

(1) E→E1+E2 { if E1.TYPE=int AND E2.TYPE=int then

begin

E.VAL:=E1.VAL + E2.VAL; E.YTPE:=int; end

else if E1.TYPE=real AND E2.TYPE=real then

begin

E.VAL:=E1.VAL + E2.VAL; E.YTPE:=real; end else error=1 }

(2) E→E1*E2 { if E1.TYPE=int AND E2.TYPE=int then

begin

E.VAL:=E1.VAL * E2.VAL;; E.YTPE:=int; end

else if E1.TYPE=real AND E2.TYPE=real then

begin

E.VAL:=E1.VAL * E2.VAL;; E.YTPE:=real; end

else error=1 }

(3) E→(E1) { E.VAL:=E1.VAL;

E.TYPE:=E1.TYPE }

(4) E→n { E.VAL:=n.LEXVAL;

E.TYPE:=n.LEXTYPE }

盛威网(www.snwei.com)专业的计算机学习网站 6

《编译原理》课后习题答案第八章

第 5 题

令 S.val 为下面的文法由 S 生成的二进制数的值(如,对于输入 101.101,S.val=5.625); S?L.L | L L?LB | B B?0 | 1

按照语法制导翻译的方法,对每个产生式给出相应的语义规则。(中国科学院计算所 1995 年)

答案:加入新的开始符号 S`和规则 S`?S,得到增广文法。语法制导定义如下:

产生式 S`?S S?L1.L2 S?L L?L1B L?B B?0 B?1

语义规则 print(S.val) S.val:=L1.val+L2.val/2L2.length S.val:=L.val L.val:=L1.val*2+B.val L.length:=L1.length+1 L.val:=B.val L.length:=1 B.val:=0 B.val:=1

如果题目是 S::=L.L | L L::=LB | B B::=0 | 1 则写成:

S`::=S {print(S.val);} S::=L1.L2 { S.val:=L1.val+L2.val/2L2.length ;} S::= L { S.val:=L.val; }

L::=L1B { L.val:=L1.val*2+B.val; L.length:=L1.length+1; } L::=B { L.val:=B.val; L.length:=1;} B::=0 B::=1

{ B.val:=0; } { B.val:=1;}

盛威网(www.snwei.com)专业的计算机学习网站 7

《编译原理》课后习题答案第八章

第 6 题

下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果 为整数,否则为实数。

E?E+T | T

T?num.num | num

(1) 给出语法制导定义确定每个子表达式的类型。

(2) 把表达式翻译成前缀形式,并且决定类型。试用一元运算符 inttoreal 把整型值

转换为相等的实型值,以使得前缀表达式中两个运算对象是同类型的。

答案:

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

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

E.type:=T.type T.type:=real T.type:=integer

为综合属性,代表各非终结符的代码属性 type 为综合属性,代表各非终结符的类型属性 inttoreal 把整型值转换为相等的实型值 (2)设 code

vtochar 将数值转换为字符串

盛威网(www.snwei.com)专业的计算机学习网站 8

《编译原理》课后习题答案第八章

语法制导定义

产生式 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) 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?num T.type:=integer T.val:=num.lexva T.code=vtochar(T.val)

盛威网(www.snwei.com)专业的计算机学习网站 9

《编译原理》课后习题答案第八章

第 7 题

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

D?i L L?,i L

| :T T?integer | real

建立一个语法制导定义,把每一个标志符的类型加在符号表中。 答案:

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

函数 addtype 实现向符号表中 i 对应项填类型信息。 语

法制导定义 产生式 D?i L L?,i L1 L?:T T?integer T?real 语义动作 D.Type:=L.Type addtype(i.entry, D.type) L.Type:=L1.Type addtype(i.entry, L.type) L.type:=T.type T.type:=integer T.type:=real

盛威网(www.snwei.com)专业的计算机学习网站 10


第08章 语法制导翻译和中间代码生成(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中国海洋大学西方经济学考研真题答案详解

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

马上注册会员

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