语义变量和语义过程:
- NEWTEMP: 它是一个函数过程, 每次调用时, 它都回送一个代表新临时变量名的整数码作为函数值. 临时变量名按产生顺序可想像为T1, T2, … 等等.
- ENTRY(i): 它是一个函数过程. 它对i所代表的标识符查找符号表,并返回它在表中的入口.
- E.PLACE: 它是和非终结符E相联系的语义变量,表示存放E值的变量名在符号表的入口或整数码(若此变量是一个临时变量).
- GEN(op, ARG1, ARG2, RESULT): 它是一个语义过程, 该过程把四元式(op, ARG1, ARG2, RESULT)填进四元式表中.
语义动作:
产生式 语义动作
(1)A→i:=E {GEN(:=, E.PLACE, ―, ENTRY(i)) }
(2)E→E(1)+E(2) {E.PLACE:=NEWTEMP;
GEN(+, E(1).PLACE, E(2).PLACE, E.PLACE) }
(3)E→E(1)*E(2) {E.PLACE:=NEWTEMP;
GEN(*, E(1).PLACE, E(2).PLACE, E.PLACE) }
(4)E→―E(1) {E.PLACE:=NEWTEMP;
GEN(@, E(1).PLACE, ― , E.PLACE) }
(5)E→(E(1)) {E.PLACE := E(1).PLACE }
(6)E→i {E.PLACE := ENTRY(i) }
自下而上分析产生中间代码的过程:
举栗大于百言:分析 A:=-B*(C+D) 的过程 (见下表)
输入 | 栈 | PLACE | 四元式 |
A:=-B*(C+D) | |||
:=-B*(C+D) | i | A | |
-B*(C+D) | i:= | A_ | |
B*(C+D) | i:=- | A_ _ | |
*(C+D) | i:=-i | A_ _B | |
*(C+D) | i:=-E | A_ _B | (@,B,_,T1) |
*(C+D) | i:=E | A_T1 | |
(C+D) | i:=E* | A_T1_ | |
C+D) | i:=E*( | A_T1_ _ | |
+D) | i:=E*(i | A_T1_ _C | |
+D) | i:=E*(E | A_T1_ _C | |
D) | i:=E*(E+ | A_T1_ _C_ | |
) | i:=E*(E+i | A_T1_ _C_D | |
) | i:=E*(E+E | A_T1_ _C_D | (+,C,D,T2) |
) | i:=E*(E | A_T1_ _T2 | |
i:=E*(E) | A_T1_ _T2_ | ||
i:=E*E | A_T1_T2 | (*,T1,T2,T3) | |
i:=E | A_T3 | (:=,T3,_,A) | |
A |