先决条件—— 编译器设计简介
null
我们的编译器基本上有两个阶段,即分析阶段和综合阶段。分析阶段从给定的源代码创建一个中间表示。合成阶段从中间表示创建等效的目标程序。
符号表- 它是一种由编译器使用和维护的数据结构,由所有标识符的名称及其类型组成。它通过快速查找标识符来帮助编译器顺利运行。
源程序的分析主要分为三个阶段。他们是:
- 线性分析- 这涉及一个扫描阶段,从左到右读取字符流。然后,它被组合成具有集体意义的各种标记。
- 层次分析- 在这个分析阶段,基于一个集体意义,标记按层次划分为嵌套组。
- 语义分析- 此阶段用于检查源程序的组件是否有意义。
编译器有两个模块,即前端和后端。前端由词法分析器、语义分析器、语法分析器和中间代码生成器组成。其余部分组装成后端。
- 词法分析器 – 它也被称为扫描仪。它将预处理器(执行文件包含和宏扩展)的输出作为纯高级语言的输入。它从源程序中读取字符,并将它们分组为词素(一系列“组合在一起”的字符)。每个词素对应一个标记。标记由正则表达式定义,这些正则表达式可以被词法分析器理解。它还可以删除词汇错误(例如错误字符)、注释和空白。
- 语法分析器 – 它有时被称为解析器。它构造了解析树。它逐个获取所有标记,并使用上下文无关语法构建解析树。
为什么是语法? 编程规则可以完全用几个产品来表示。使用这些产品,我们可以表示程序实际上是什么。必须检查输入是否为所需格式。 解析树也称为派生树。解析树通常用于检查给定语法中的歧义。存在与派生树相关的某些规则。
- 任何标识符都是一个表达式
- 任何数字都可以称为表达式
- 在给定表达式中执行任何操作都会生成一个表达式。例如,两个表达式之和也是一个表达式。
- 可以对解析树进行压缩以形成语法树
如果输入与语法不一致,可以在该级别检测到语法错误。
- 语义分析器- 它验证解析树是否有意义。它还生成一个经过验证的解析树。它还进行类型检查、标签检查和流控制检查。
- 中间代码生成器 – 它生成中间代码,这是一种很容易被机器执行的形式。我们有很多流行的中间代码。示例–三个地址代码等。中间代码使用最后两个阶段转换为机器语言,这两个阶段依赖于平台。
在编写中间代码之前,每个编译器的代码都是一样的,但在这之后,它取决于平台。要构建一个新的编译器,我们不需要从头开始构建。我们可以从已经存在的编译器中获取中间代码,并构建最后两部分。
- 代码优化器 – 它会转换代码,从而消耗更少的资源并提高速度。被转换代码的含义不会改变。优化可以分为两种类型:机器相关优化和机器无关优化。
- 目标代码生成器– 目标代码生成器的主要目的是编写机器能够理解的代码,以及寄存器分配、指令选择等。输出取决于汇编程序的类型。这是汇编的最后阶段。优化后的代码被转换成可重定位的机器代码,然后形成链接器和加载程序的输入。
所有这六个阶段都与符号表管理器和错误处理程序相关,如上图所示。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END