编译原理第十一章习题

一、 问答题

问答第1题
  图11.17是图11.16的C代码的部分四元式代码序列?
  (1) 请将图11.17的四元式代码序列划分为基本块并做出其流图?
  (2) 将每个基本块的公共子表达式删除?
  (3) 找出流图中的循环,将循环不变量计算移出循环外?
  图11.16
  void quicksort(m,n)
  int m,n;
  { int i,j;
   int v,x; if (n<=m) return;
   /* fragment begins here */
   i = m-1;
   j = n;
   v = a[n];
   while(1) {
    do i = i+1;while (a[i]<v);
    do j = j-1; while (a[j]>v);
    if (i>=j) break;
     x = a[i];
     a[i] = a[j];
     a[j] = x;
   }
   x = a[i];
   a[i] = a[n];
   a[n] = x;
   /* fragment ends here */
   quicksort (m,j);
   quicksort(i+1,n);
  }
  图11.17
(1)  i:=m-1
(2)  j:=n
(3)  t1:=4*n
(4)  v:=a[t1]
(5)  i:=i+1
(6)  t2:=4*i
(7)  t3:=a[t2]
(8)  if t3< v goto (5)
(9)  j:=j-1
(10) t5:=4*j
(11) t5:=a[t4]
(12) if t5> v goto (9)
(13) if i >= j goto (23)
(14) t6:=4*i
(15) x:=a[t6]
(16) t7:=4*i
(17) t6:=4*j
(18) t9:=a[t8]
(19) a[t7]:=t9
(20) t10:=4*j
(21) a[t10]:=x
(22) goto (5)
(23) t11:=4*i
(24) x:=a[t11]
(25) t12:=4*i
(26) t13:=4*n
(27) t14:=a[t13]
(28) a[t12]:=t14
(29) t15:=4*n
(30) a[t15]:=x


问答第2题
  如下程序流图(图11.18)中,B3中的i∶=2是循环不变量,可以将其提到前置结点吗?你还能举出一些例子说明循环不变量外移的条件吗?
  图11.18
  



问答第3题
  对图11.19的流图:
  (1) 求出流图中各结点n的必经结点集D(n);
  (2) 求出流图中的回边;
  (3) 求出流图中的循环。
  图11.19