E -> num
E -> true
E -> false
E -> E + E
E -> E && E
E -> E > E
假设其语义规则为:每个表达式E都有一个类型(整型)。具体地:
E + E 类型的表达式中两个子表达式都必须是整型(即num),结果类型为整型。
E && E 类型的表达式中两个子表达式都必须是布尔型(即true或false),结果类型为布尔型。
E > E 类型的表达式中两个子表达式都必须是整型,结果类型为布尔型。
回答以下问题:
(1)给出一段伪代码,能完成上述语言的语义分析,当输入表达式语义错误时报错,否则返回输入表达式的类型(假设抽象语法树已经建立好,词法分析已完成);
(2)用语法制导翻译SDD的方法描述上述语义分析的语义动作,并指出该SDD中的属性哪些是综合属性、哪些是继承属性。
(3)如果将E -> E + E 改为两个子表达式可以是整型或布尔型,结果类型为整型,那么对应的语义分析伪代码和语法制导翻译SDD要如何改变?
答
(1)语义分析伪代码:
enum Type check_E(E e){
switch(e->kind)
case NUM:
return INT;
break;
case TRUE || FALSE:
return BOOL;
break;
case ADD:
e1 = check_E(e->left);
e2 = check_E(e->right);
if (e1 == INT && e2 == INT) {
return INT;
break;
}
else emit("runtime_error");
case AND:
e1 = check_E(e->left);
e2 = check_E(e->right);
if (e1 == BOOL && e2 == BOOL) {
return BOOL;
break;
}
else emit("runtime_error");
case larger:
e1 = check_E(e->left);
e2 = check_E(e->right);
if (e1 == INT && e2 == INT) {
return BOOL;
break;
}
else emit("runtime_error");
}
(2)SDD如下:
1. E -> num {E.Type = INT;}
2. E -> true {E.Type = BOOL;}
3. E -> false {E.Type = BOOL;}
4. E -> E1 + E1 {if (E1.Type == INT && E2.Type == INT) E.Type = INT;
else emit("runtime_error");}
5. E -> E1 && E1 {if (E1.Type == IBOOL && E2.Type == BOOL) E.Type = BOOL;
else emit("runtime_error");}
6. E -> E1 > E1 {if (E1.Type == INT && E2.Type == INT) E.Type = BOOL;
else emit("runtime_error");}