6.5 节的练习
6.5.1
假定图 6-26 中的函数 widen 可以处理图 6-25a 的层次结构中的所有类型,翻译下列表达式。假定 c 和 d 是字符类型,s 和 t 是短整型, i 和 j 为整型, x 是浮点型。
- x = s + c
- i = s + c
- x = (s + c) * (t + d)
解答
-
x = s + c
t1 = (int) s t2 = (int) c t3 = t1 + t2 x = (float) t3
-
i = s + c
t1 = (int) s t2 = (int) c i = t1 + t2
-
x = (s + c) * (t + d)
t1 = (int) s t2 = (int) c t3 = t1 + t2 t4 = (int) t t5 = (int) d t6 = t4 + t5 t7 = t3 + t6 x = (float) t7
6.5.2
像 Ada 中那样,我们假设每个表达式必须具有唯一的类型,但是我们根据一个子表达式本身只能推导出一个可能类型的集合。也就是说,将函数 E1 应用于参数 E2(文法产生式为 E -> E1(E2))有如下规则:
E.type = {t | 对 E2.type 中的某个 s, s -> t 在 E1.type 中}
描述一个可以确定每个字表达式的唯一类型的 SDD。它首先使用属性 type,按照自底向上的方式综合得到一个可能类型的集合。在确定了整个表达式的唯一类型之后,自顶向下地确定属性 unique 的值,整个属性表示各子表达式的类型。