证明语句 A = B * C + 20 的完整编译过程,其中 A、B、C 为实数类型。
解决方案
符号表
序号 | 变量名 | 变量类型 |
---|---|---|
200 | A | 浮点数 |
204 | B | 浮点数 |
208 | C | 浮点数 |
现在,我们将了解如何在每个级别执行编译器阶段以及它的工作原理。
词法分析
这是第一步,它充当编译器和源代码之间的桥梁。它一次读取源代码一个字符,并将源代码设计成一系列称为标记的原子单元。
在这个阶段,我们将了解如何对表达式进行标记化。
A → 标识符:(id, 1)
= → 运算符:赋值
B → 标识符:(id, 2)
* → 运算符:乘法
C → 标识符:(id, 3)
+ → 运算符:二元加法
20 → 常量:整数
最终表达式如下:
id1=id2*id3+20
语法分析
它也称为解析器。它接收来自上一阶段(词法分析)生成的标记作为输入,并生成称为语法树或解析树的分层结构。
在这个阶段,它可以在对表达式进行标记化后检查语法。
表达式的语法分析如下:
语义分析
此阶段以语法树为输入,并确定程序的语义准确性。然而,即使标记是准确的且语法正确的,它们也可能在语义上不精确。因此,语义分析器确定语句结构的语义 **(含义)**。在这个阶段,它可以验证语法树的类型和语义操作。
中间代码生成
此阶段以语法和语义上正确的形式作为输入,并生成源代码的相同中间表示法。在这个阶段,我们将提供修改后的解析树,并在转换为中间程序后作为输出,创建一个三地址码。
T1=id2 * id3 T2=int to real (20) T3=T1+T2 id1=T3
代码优化
这是一个可选阶段。它将源程序的中间表示转换为高效的代码。在这个阶段,它将以三地址码作为输入,并作为输出,识别优化后的代码。
T1=id2 * id3 id1=T1+ 20.0
代码生成
这是编译过程的最后一步。它将优化的中间代码转换为机器/汇编代码。它为程序中的变量分配内存位置。
在最后阶段,可以看到如何将最终表达式修改为汇编程序。
广告