纯纯傻逼课
本章主要是讲解中间代码的形式, 并使用上一章的方法完成程序部分的翻译.
Chapter-6: 中间代码生成
DAG
下面是两种表示形式
三地址编码的表示
x = y op z
a = b * b - c
有:
(1) 四元式序列如下:
op | arg1 | arg2 | result | |
---|---|---|---|---|
0 |
* |
b |
b |
t1 |
1 |
- |
t1 |
c |
t2 |
2 |
= |
t2 \mid |
a |
(2) 三元式序列
op | arg1 | arg2 | |
---|---|---|---|
0 |
* |
b |
b |
1 |
- |
(0) |
c |
2 |
= |
t2 \mid (1) |
(3) 间接三元式序列
instruction | |
---|---|
35 |
(0) |
36 |
(1) |
37 |
(2) |
op | arg1 | arg2 | |
---|---|---|---|
0 |
* |
b |
b |
1 |
- |
(0) |
c |
2 |
= |
t2 \mid (1) |
表达式的翻译
翻译成中间代码及其考验之前一章的内容.
运算翻译
使用E.code
的拼接.
实时输出的增量编译:
数组输出
实时输出的增量编译:
控制流
控制流的”控制”主要是布尔表达式, 其文法如下:
\[B\to B \| B \mid B \&\& B \mid !B \mid (B) \mid E rel E \mid true \mid false\]设计SDT结果如下:
根据程序设计的语义, 比如a||b
, 如果a为真, b语句可能就不会运行.
将布尔表达式翻译成没有任何布尔算符的三地址代码,运行时只计算部分表达式,称为“短路”或“转移”代码