P532.8 构建一个语法制导翻译模式,将算术表达式从后缀表示翻译成中缀表示。
给出输入95-2*和952*-的注释分析树。
(仅供参考一定要保证转换后的中缀表达式与原后缀表达式的优先级相同)
1 后缀算术表达式的文法如下:
expr →expr expr + | expr expr – | expr expr * | expr expr / |digit
digit →0 | 1 | 2 | 3 | … | 9
2 将后缀表达式翻译成中缀表达式的语法制导定义(文法+语义规则)
4 95-2*和952*-的翻译成后缀形式的语义动作与注释分析树。
expr
expr expr *
print(‘(‘) print(‘)‘) expr expr - 5 9 digit 2 print(‘-’) ‘9’) print(‘5’) print(‘2’)
print(‘*’) 95-2*的深度优先遍历语义动作 expr expr expr - print(‘(‘) print(‘)‘)
expr expr digit 2 digit 5
digit 9 print(‘*’) ‘5’) print(‘2’) print(‘9’) print(‘-’) 952*-的深度优先遍历语义动作
expr.t=(9-5)*2
expr=(9-5) expr.t=2 *
expr.t=9 expr.t=5
-
digit.t=5 5
digit.t=9 9 digit.t=2
2
输入为95-2*的注释分析树
expr.t=(9-5*2)
expr.t=5*2 expr.t=9 -
expr.t=5 expr.t=2
*
digit.t=2
2
digit.t=5 5
digit.t=9 9 输入为952*-的注释分析树
P 542.18 考虑下面的if-then 语句和if-then-else 语句的部分文法 stmt → if expr then stmt
| if expr then stmt else stmt | other
其中other 代表语言中的其他语句。
a)证明该文法是具有二义性的。
b)构造一个等价的无二义性文法,使得else 与前面最近的没有匹配的then 匹配。
c)基于该文法构造一个语法制导翻译模式,将条件语句翻译改成堆栈机代码。
a) 二义性证明
根据文法 我们发现 If E 1 then if E 2 then S 1 else S 2 有2棵语法树(2个推导方法)如
下所示:
所以该文法具有二义性。
b) 等价无二义性文法构造 使else 与最近的未被匹配的then 相匹配 stmt → matched_stmt | unmatched_stmt
matched_stmt → if expr then matched_stmt else matched_stmt | other unmatched_stmt → if expr then stmt
| if expr then matched_stmt else unmatched_stmt
Form 1:
stmt stmt
stmt
expr 12then
else if
E 2
1then
if
stmt stmt
expr 1then
if
stmt expr 221then
else
if stmt stmt Form 2:
c)堆栈机代码
stmt if expr then stmt1
{ out := newlabel;
stmt.t := expr.t ||
‘gofalse’ out ||
stmt1.t ||
‘label’ out }
stmt→if expr then stmt1 else stmt2
{ out := newlabel;
stmt.t := expr.t ||
‘gofalse’ out ||
stmt1.t ||
‘label’ out ||
stmt2.t
} stmt→other 其它语句略。