语义分析与代码生成
引入
词汇
| English | 释义 | 拼音 |
|---|---|---|
| symbol table/ˈsɪmbl ˈteɪbl/ | 符号表 | fú hào biǎo |
| intermediate representation | 中间表示 | zhōng jiān biǎo shì |
用含义装饰
- 符号表 symbol table 把标识符映到(类型,作用域);类型规则自底向上走树:$\mathbf{id} + \mathbf{id}$ 两侧都要数值。输出是中间表示 intermediate representation——三地址码、每行一个操作。

{exercise:uni-cs1106-decorate}
练习
符号表绑定——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
先名字解析后类型检查:作用域优先。
课程程序精确版
count = a1 + b2 * 3,a1, b2: int:表里三条 int 绑定;检查器先验 $b_2 \times 3$ 再验 $a_1 + (\ldots)$。IR:t1 = b2 * 3; t2 = a1 + t1; count = t2——三条指令、一个临时变量,套件生成。- 把
b2换成str:检查器带着词法位置拒绝b2 * 3——位置是整条管道的错误货币。
{exercise:uni-cs1106-program}
练习
count = a1 + b2 * 3 发射的 IR 为——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
三地址:每行一个操作,这里一个临时变量。
为何要 IR
- 直接翻译会相乘:$m$ 种语言 $\times$ $n$ 个目标 = $mn$ 个编译器;IR 把它变成 $m + n$。优化住在 IR 上——折叠只对字面量($2 \times 3 \to 6$;$b_2 \times 3$ 不动),每个优化都是关于 IR 语义的证明。
- 先查名字再查类型(先作用域),装饰完再发射,绝不穿过非字面量折叠。
{exercise:uni-cs1106-ir}
练习
常量折叠适用于——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
b2 × 3 不动:b2 不是字面量——折叠仅限字面量。