parsing - 有关将语法树转换为程序集的资源?

标签 parsing compiler-construction assembly abstract-syntax-tree

主要作为学习练习,我正在从头开始编写虚拟机、汇编器和编译器,不依赖于外部工具。

我相信我对虚拟机和汇编器的工作方式以及编译器的某些部分有一个不错的概念性理解。

这是我想知道的:
在编译器中,假设我已经将源代码变成了一个语法树。我要经过什么过程才能将此语法树转换为程序集?

(让我们假设一些简单的语言结构,比如 if 和 while。我在这里寻找一个最小和简单的解释。)

我对复杂的解决方案或基于现有工具的解决方案并不特别感兴趣。相反,我想要大约 1 页的内容,对从语法树到汇编背后的思想进行广泛全面的描述。

有人知道这样的资源吗?

谢谢 :)

最佳答案

对编译器问题的强制性回答是阅读 Dragon 书(编译器:原理、技术和工具)。当你说你已经把源代码变成了一个语法树,你到底是什么意思?通常解析的第一阶段是创建抽象语法树 (AST)。下一步通常是待办事项归因。属性是 AST 中节点的属性,不一定与源语言有任何关系,但对代码生成至关重要。通常在此处进行某种形式的类型检查以确定内存大小要求,以及在面向对象语言中要调用的函数。例如,如果您的来源是 obj1=obj2+obj3,那么在您确定 obj2 的类型之前,您真的不知道加号是什么。

因此,尝试回答您的问题。 1) 将源代码解析为 AST。 2)在AST上做归因。 3)生成中间代码(想象你指的是程序集)。

龙书的第 5 章和第 6 章详细介绍了这一点。真正棘手的部分是弄清楚代码生成所需的属性。此外,if 语句也存在一些棘手的问题。例如,如果 if 条件失败,你知道你需要跳过一些代码,但至少在最初,你不知道多远。回补丁是解决此问题的一种方法。

关于parsing - 有关将语法树转换为程序集的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938179/

相关文章:

javascript - 将 URL 查询字符串解析为数组

c++ - C++ 中不允许使用 volatile + 对象组合?

assembly - sra(算术右移)与 srl(逻辑右移)

c - 在适用于 ARM Cortex M4f 的 Code Composer studio 中将堆栈指针的值保存在 C 变量中

指数幂程序的汇编错误结果

string - 使用 golang 根据位置解析字符串的好方法是什么?

parsing - Go 中的上下文无关文法 (CFG) 解析器

java - 什么是最好的 java html 解析器?

c# - 开源 C++ 到 C# 编译器/转换器

compiler-construction - 在F#中使用Roslyn