第8章 语法制导翻译和中间代码生成
课后习题
第8章 习题
第1题:
给出下面表达式的逆波兰表示(后缀式): (1)a*(-b+c)
(2) if(x+y)*z=0 then s∶=(a+b)*c else s∶=a*b*c
第2题:
请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式和四元式序列。
第3题:
采用语法制导翻译思想,表达式E的\值\的描述如下: 产生式 语义动作
(0) S′→E {print E.VAL} (1) E→E1+E2 {E.VAL∶=E1.VAL+E2.VAL} (2) E→E1*E2 {E.VAL∶=E1.VAL*E2.VAL} (3) E→(E1) {E.VAL∶=E1.VAL}
(4) E→n {E.VAL∶=n.LEXVAL} 假如终结符n可以是整数或实数,算符+和*的运算对象类型一致,语义处理增加\类型匹配检查\,请给出相应的语义描述。
第4题:
请将下列语句
while (AD) then X:=Y+Z 翻译成四元式
第8章 语法制导翻译和中间代码生成
问答题答案
问答第1题
给出下面表达式的逆波兰表示(后缀式): (1) a*(-b+c) 答案:ab-c+*
(2) if(x+y)*z=0 then s∶=(a+b)*c else s∶=a*b*c
答案:xy+z*0=sab+c*:=sab*c*:=¥(注:¥表示if-then-else运算)
问答第2题
请将表达式-(a+b)*(c+d)-(a+b)分别表示成三元式、间接三元式和四元式序列。 答案:三元式 (1) (+ a, b) (2) (+ c, d) (3) (* (1), (2)) (4) (- (3), /) (5) (+ a, b) (6) (- (4), (5)) 间接三元式
间接三元式序列 间接码表 (1) (+ a, b) (1) (2) (+ c, d) (2) (3) (* (1), (2)) (3) (4) (- (3), /) (4) (5) (- (4), (1)) (1) (5) 四元式 (1) (+, a, b, t1) (2) (+, c, d, t2) (3) (*, t1, t2, t3) (4) (-, t3, /, t4) (5) (+, a, b, t5) (6) (-, t4, t5, t6)
问答第3题
采用语法制导翻译思想,表达式E的\值\的描述如下: 产生式 语义动作
(0) S′→E {print E.VAL} (1) E→E1+E2 {E.VAL∶=E1.VAL+E2.VAL} (2) E→E1*E2 {E.VAL∶=E1.VAL*E2.VAL} (3) E→(E1) {E.VAL∶=E1.VAL}
(4) E→n {E.VAL∶=n.LEXVAL}
假如终结符n可以是整数或实数,算符+和*的运算对象类型一致,语义处理增加\类型匹配检查\,请给出相应的语义描述。
第8章 语法制导翻译和中间代码生成
答案:
(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 E.TYPE=real AND E.TYPE=real then begin
E.VAL:=E.VAL * E.VAL;; E.YTPE:=real; end else error=1
1
2
1
2
}
(3) E→(E1) { E.VAL:=E1.VAL; E.TYPE:=E1.TYPE } (4) E→n { E.VAL:=n.LEXVAL;
E.TYPE:=n.LEXTYPE } 第4题
请将下列语句
while (AD) then X:=Y+Z 翻译成四元式 答案:
假定翻译的四元式序列从(100)开始: (100) if A
第8章 语法制导翻译和中间代码生成
(107)
相关推荐: