Compilers Principles, Techniques, & Tools (purple dragon book) second edition exercise answers

6.5 节的练习

6.5.1

假定图 6-26 中的函数 widen 可以处理图 6-25a 的层次结构中的所有类型,翻译下列表达式。假定 c 和 d 是字符类型,s 和 t 是短整型, i 和 j 为整型, x 是浮点型。

  1. x = s + c
  2. i = s + c
  3. x = (s + c) * (t + d)

解答

  1. x = s + c

     t1 = (int) s
     t2 = (int) c
     t3 = t1 + t2
     x = (float) t3
    
  2. i = s + c

     t1 = (int) s
     t2 = (int) c
     i = t1 + t2
    
  3. 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 的值,整个属性表示各子表达式的类型。