女王控的博客

编译原理

8 篇文章

编译器之旅(八)——IF语句

需求 现在我们可以比较值了,是时候在我们的语言中添加 IF 语句了,因此让我们看一下 IF 语句的一般语法以及如何将它们转换为汇编语言。 准备 IF 语法 IF 语句的语法为: 通常如何将其转换为汇编语言?事实证明如果相反的比较成立,我们将执行相反的比较并跳转: 其中 L1 和 L2 是汇编语言标签。 在我们的编译器中生成程序集 现在我们输出代码以基于比较来设置寄存器,例如 变成 但是对于 IF 语句,我们需要进行相反的比较: 应该变成: 因此在这一部分中,我已经实现了 IF… »

编译器之旅(七)——比较运算符

需求 接下来我要添加 IF 语句,但是后来我意识到最好先添加一些比较运算符。事实证明这很容易,因为它们像现有的一样是二进制运算符。 因此让我们赶紧看看增加六个比较符有什么变化:==,!=,<,>,<= 和 >=。 核心逻辑 添加新令牌 我们有六个新令牌,所以我们将它们添加到 defs.h… »

编译器之旅(六)——变量

需求 在语言中添加变量,希望能够做到 声明变量 使用变量获取存储的值 分配给变量 这是 input02 输入文件的内容: 最明显的变化是在表达式中具有变量声明,赋值语句和变量名称。但是在开始之前,让我们先看看如何实现变量。 准备 BNF 语法 核心逻辑 符号表 每个编译器都需要一个符号表,稍后我们将不仅仅持有全局变量,但现在这是表中的一项的结构(来自 defs.h): 我们在 data.h 中有一个符号数组: Globs 实际上是位于 sym.c 中用于管理符号表的文件,具有以下功能: int… »

编译器之旅(五)——声明语句

需求 在语言中添加一些声明语句: 准备 BNF 语法说明 我们已经看到了表达式的 BNF 表示法,现在让我们为以上语句定义 BNF 语法: 输入文件由几个语句组成,它们可以是一个语句,也可以是后面跟有更多语句的语句,每个语句均以关键字开头 print,然后是一个表达式,然后是分号。 核心逻辑 词法扫描器的更改 在编写解析以上语法的代码之前,我们需要在现有代码中添加更多细节,让我们从词法扫描器开始。 为分号添加 print… »

编译器之旅(四)——真正的编译器

需求 用生成 x86-64 汇编代码的代码替换程序中的解释器 核心逻辑 修改解释树 开始之前,先回顾以下解释器的代码: interp.c 该 interpretAST() 函数先走给定的 AST 树深度。它先遍历任何左子树,然后再遍历右子树,最后它使用 op 当前树的底部的值对这些子代进行操作。 如果该 op 值是四个数学运算符之一,则将执行此数学运算。如果该 op… »

0%