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

6.2 节的练习

6.2.1

将算数表达式 a+-(b+c) 翻译成

  1. 抽象语法树
  2. 四元式序列
  3. 三元式序列
  4. 间接三元式序列

解答

  1. 抽象语法树

    6 2 1

  1. 四元式序列

    op arg1 arg2 result
    0 + b c t1
    1 minus t1 t2
    2 + a t2 t3
  2. 三元式序列

    op arg1 arg2
    0 + b c
    1 minus (0)
    2 + a (1)
  3. 间接三元式序列

    op arg1 arg2
    0 + b c
    1 minus (0)
    2 + a (1)
    instruction
    0 (0)
    1 (1)
    2 (2)

参考

6.2.2

对下列赋值语句重复练习 6.2.1

  1. a = b[i] + c[j]
  2. a[i] = b*c - b*d
  3. x = f(y+1) + 2
  4. x = *p + &y

解答

  1. a = b[i] + c[j]

    • 四元式

        0) =[]   b    i    t1
        1) =[]   c    j    t2
        2) +     t1   t2   t3
        3) =     t3        a  
      
    • 三元式

        0) =[]   b    i
        1) =[]   c    j
        2) +     (0)  (1)
        3) =     a    (2)  
      
    • 间接三元式

        0) =[]   b    i
        1) =[]   c    j
        2) +     (0)  (1)
        3) =     a    (2)  
      
        0) 
        1)
        2)
        3)
      
  2. a[i] = b*c - b*d

    • 四元式

        0) *    b    c    t1
        1) *    b    d    t2
        2) -    t1   t2   t3
        3) []=  a    i    t4
        4) =    t3        t4
      
    • 三元式

        0) *    b    c
        1) *    b    d
        2) -    (0)  (1)
        3) []=  a    i
        4) =    (3)  (2)
      
    • 间接三元式

        0) *    b    c
        1) *    b    d
        2) -    (0)  (1)
        3) []=  a    i
        4) =    (3)  (2)
      
        0)
        1)
        2)
        3)
        4)
      
  3. x = f(y+1) + 2

    • 四元式

        0) +        y    1    t1
        1) param    t1
        2) call     f    1    t2
        3) +        t2    2   t3
        4) =        t3        x
      
    • 三元式

        0) +        y     1
        1) param    (0)
        2) call     f     1
        3) +        (2)   2
        4) =        x     (3)
      
    • 间接三元式

        0) +        y     1
        1) param    (0)
        2) call     f     1
        3) +        (2)   2
        4) =        x     (3)
      
        0)
        1)
        2)
        3)
        4)
      

参考

6.2.3 !

说明如何对一个三地址代码序列进行转换,使得每个被定值的变量都有唯一的变量名。