赋值语句的文法及语义动作描述如下: (1)A→i:=E {gen (:=, E.place,_,entry(i));} (2)E→E1+E2 {E.place:=newtemp;gen(+, E1.place, E2.place, E.place);} (3)E→E1*E2 {E.place:=newtemp; gen(*, E1.place, E2.place, E.place);} (4)E→-E1 {E.place:=newtemp;gen(@,E1.place,_,E.place);} (5)E→(E1) {E.place:=E1.place;} (6)E→i {E.place:=entry(i);} 写出赋值语句X:=-B*(C+D)*A的自下而上的语法制导翻译过程。
时间: 2024-03-30 17:38:16 浏览: 151
下面是赋值语句X:=-B*(C+D)*A的自下而上的语法制导翻译过程:
1. A → i := E,调用 gen( :=, E.place, _, entry(i)) 生成指令:将 E.place 赋值给变量 i。
2. E → - E1,调用 gen(@, E1.place, _, E.place) 生成指令:将 E1.place 取反后的值赋值给新的临时变量 E.place。
3. E → i,调用 entry(i) 将变量 i 的地址赋值给 E.place。
4. E → E1 * E2,调用 newtemp 生成一个新的临时变量 T,调用 gen(*, E1.place, E2.place, T) 生成指令:将 E1.place 和 E2.place 相乘,结果存储在临时变量 T 中,再将 T 的值赋值给 E.place。
5. E → E1 + E2,调用 newtemp 生成一个新的临时变量 T,调用 gen(+, E1.place, E2.place, T) 生成指令:将 E1.place 和 E2.place 相加,结果存储在临时变量 T 中,再将 T 的值赋值给 E.place。
6. E → ( E1 ),将 E1.place 赋值给 E.place。
根据以上语法制导翻译过程,赋值语句X:=-B*(C+D)*A的自下而上的语法制导翻译过程为:
1. entry(B):将变量 B 的地址赋值给 E1.place。
2. entry(C):将变量 C 的地址赋值给 E1.place。
3. entry(D):将变量 D 的地址赋值给 E2.place。
4. E1.place:调用 newtemp 生成一个新的临时变量 T1,调用 gen(+, C, D, T1) 生成指令:将 C 和 D 相加,结果存储在临时变量 T1 中。
5. E.place:调用 newtemp 生成一个新的临时变量 T2,调用 gen(*, B, T1, T2) 生成指令:将 B 和 T1 相乘,结果存储在临时变量 T2 中,再将 T2 的值取反后赋值给 X。
6. entry(A):将变量 A 的地址赋值给 E1.place。
7. E.place:调用 newtemp 生成一个新的临时变量 T3,调用 gen(*, T2, A, T3) 生成指令:将 T2 和 A 相乘,结果存储在临时变量 T3 中,再将 T3 的值赋值给 X。
因此,赋值语句X:=-B*(C+D)*A的自下而上的语法制导翻译过程为:
entry(B)
entry(C)
entry(D)
newtemp T1
gen(+, C, D, T1)
newtemp T2
gen(*, B, T1, T2)
gen(@, T2, _, X)
entry(A)
newtemp T3
gen(*, T2, A, T3)
gen(:=, T3, _, entry(X))
阅读全文