它与具体机器无关,便于优化、也便于移植(一个前端配多个后端)。常见四种形式:
| 形式 | 样子 | a+b*c 的写法 |
|---|---|---|
| 逆波兰式 (后缀式) | 运算符写在操作数之后,无括号无优先级问题 | abc*+ |
| 三元式 | (op, arg1, arg2),结果用序号引用 | (1)(*,b,c) (2)(+,a,(1)) |
| 间接三元式 | 三元式表 + 间接码表(按执行顺序存指针) | 同上+一张顺序表 |
| 四元式 ★ | (op, arg1, arg2, result),最常用 | (*,b,c,T1) (+,a,T1,T2) |
四元式赋值:a:=b 写成 (:=, b, _, a);跳转:无条件 (j,_,_,L)、条件 (j<,a,b,L)。"_"表示该域空着。
① 按运算优先级定先后次序;② 每个二元运算 a op b 生成一条 (op, a, b, Tᵢ),结果存入新临时变量 Tᵢ;③ 后续运算用 Tᵢ 当操作数;④ 最后赋值生成 (:=, 结果, _, 目标)。
a := b*c + b*d 翻译成四元式、三元式、逆波兰式。(1) (*, b, c, T1) (2) (*, b, d, T2) (3) (+, T1, T2, T3) (4) (:=, T3, _, a )三元式:
(1) (*, b, c) (2) (*, b, d) (3) (+, (1), (2)) (4) (:=, a, (3))逆波兰式:
a b c * b d * + := (表达式部分即 bc*bd*+)
if-then-else 或 while 的翻译题。