女王控的博客

全部

198 篇文章

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

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

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

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

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

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

编译器之旅(三)——运算符优先级

需求 我们在上一部分中看到,解析器不一定强制执行我们语言的语义,它仅强制执行语法的语法和结构规则。 我们最终得到了计算表达式错误值(如 2 _ 3 + 4 _ 5)的代码,因为该代码创建了一个如下所示的 AST… »

编译器之旅(二)——解析简介

需求 为上一节识别的语言定义一个语法 准备 BNF 这是语法的 BNF 描述 竖线将语法中的选项分开,因此含义是: 表达式可以只是一个数字,或者 一个表达式是两个用’ * ‘标记分隔的表达式,或者 一个表达式是两个用’/‘标记分隔的表达式,或者 一个表达式是两个用’+‘标记分隔的表达式,或者 一个表达式是两个由’-‘标记分隔的表达式 数字始终是 T_INTLIT 语法的 BNF… »

0%