编译原理冲刺 · 第 11 课 ⏱ 冲刺模式 · ≤1周

中间语言:四元式 · 三元式 · 逆波兰

把表达式翻译成"机器无关"的中间代码。对应教材第 7 章 7.1。
🎯 本课唯一目标
会把表达式/赋值语句翻译成四元式、三元式、逆波兰式三种形式。
为什么学它? 中间代码在全景图里位于"语义分析"之后。考试常考"把某表达式翻译成四元式",是纯机械的送分题

一、为什么要中间代码

与具体机器无关,便于优化、也便于移植(一个前端配多个后端)。常见四种形式:

二、四种形式

形式样子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*+
💡 三种形式互相对应:四元式用临时变量 T 串结果,三元式用序号 (i) 串结果,逆波兰用位置(栈)隐式串结果。

四、你来做

1. 四元式有几个域?
2. 逆波兰式(后缀式)的特点是?
3. 表达式 a+b*c 的逆波兰式是?
4. 间接三元式相比普通三元式的好处是?
5. 最常用的中间代码形式是?
得分:0 / 5
四元式 (op, arg1, arg2, result),临时变量 T 串结果
逆波兰:运算符挪到操作数后面
📺 主源推荐 哈工大《编译原理》中间代码生成讲 — 中国大学MOOC[1]
🙋 想练带条件/循环语句翻译成四元式(含跳转 j)?跟我说,我给你一道 if-then-elsewhile 的翻译题。
  1. [1] 中间语言(逆波兰、三元式、间接三元式、四元式):陈火旺《程序设计语言编译原理》7.1;哈工大 MOOC中间代码生成讲。