某翻译器的翻译模式如下: S’→S { print (S.num); } S→(L) { S.num=L.num+1; } S→a { S.num=0; } L→L1,S { L.num=L1.num+S.num; } L→S { L.num=S.num; } 1请指出文法中各个非终结符的属性是综合属性还是继 承属性。 2简述其语义功能。 3请画出输入为 (a,(a,a)) 时的注释分析树。 4计算输入为 (a,(a,a)) 时该翻译模式的最后输出结 果。
时间: 2024-03-17 10:43:34 浏览: 78
1. 根据文法,S.num 和 L.num 都是综合属性。
2. 这个文法描述了对输入的语法结构进行分析,并在分析过程中计算每个子树的 num 属性,最终输出整个树的 num 属性。具体来说,当遇到终结符 a 时,将 S.num 赋值为 0;当遇到非终结符 L 时,将 L.num 计算为 L1.num + S.num,其中 L1 是 L 的第一个子节点,S 是 L 的第二个子节点,然后将 L.num 传递给父节点 S。最终,当整个树分析完毕时,输出 S.num。
3. 输入为 (a,(a,a)) 的注释分析树如下:
```
S[0]
|
+----+----+
| |
(L) S[0]
| |
+----+----+
| |
a (L)
|
+---+---+
| |
a S[1]
|
+---+---+
| |
a (L)
|
+---+---+
| |
a S[1]
```
其中,S[0], S[1], S[2] 分别表示三个 S 节点,它们的 num 属性都为 0;L[1], L[2], L[3] 分别表示三个 L 节点,它们的 num 属性分别为 1, 2, 2;a[1], a[2], a[3], a[4] 分别表示四个终结符 a。
4. 计算过程如下:
```
S[0].num = 0
L[1].num = L[1].num + S[0].num = 1
S[1].num = 0
L[2].num = L[2].num + S[1].num = 2
S[2].num = 0
L[3].num = L[3].num + S[2].num = 2
S[0].num = S[0].num + L[1].num = 1
S[1].num = S[1].num + L[3].num = 2
S[0].num = S[0].num + S[1].num = 3
```
因此,输入为 (a,(a,a)) 时,输出 3。
阅读全文