给定如下的 C 程序片段(假定 A 的类型为 int A[10][100][30],其它变量的类型是 int),请画出抽象语法树,然后翻译成四元式序列或三地址语句。请注意关键字 static 以及自增运算在 C 语言的语义。 sum = 0 ; for (m = 0 ; m < 10; ++ m) { static int n = 0 ; while (n < 100) { sum += A[m] [ n ] [ 2 0 ] ; n ++; } i f (0 != m % 2) { n = 20; } else { n = 10; } }
时间: 2023-06-24 11:07:03 浏览: 76
抽象语法树如下:
```
=
/ \
sum 0
|
for
/ | \
/ | \
= < ++
/ \ | |
m 0 10 n
|
while
/ | \
/ | \
+= [] ++
/ \ /|\ |
sum A m n n
|
if
/ \
/ \
= =
/ \ / \
n 20 n 10
```
四元式序列或三地址语句如下:
```
1. sum = 0
2. m = 0
3. L1: if m < 10 goto L2
4. goto L5
5. L2: if n >= 100 goto L4
6. t1 = m * 100 * 30
7. t2 = n * 30
8. t3 = t1 + t2
9. t4 = &A
10. t5 = t4 + t3
11. t6 = *t5
12. t7 = t6 + 20
13. sum = sum + t7
14. n = n + 1
15. goto L3
16. L4: if m % 2 != 0 goto L6
17. n = 10
18. goto L7
19. L6: n = 20
20. L7: m = m + 1
21. goto L1
```
其中,L1-L7 是标号,goto 语句跳转到对应标号的位置。&A 表示 A 数组的地址,*t5 表示数组 A[m][n][20] 的值,t7 表示该值加上 20 后的结果。