《编译原理》课后习题答案第八章
采用语法制导翻译思想,表达式 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