将语法树转换为汇编的资源?

Mik*_*eC8 4 compiler-construction assembly parsing abstract-syntax-tree

主要是作为一个学习练习,我从头开始编写虚拟机,汇编器和编译器,这取决于没有外部工具.

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

这就是我想知道的: 在编译器中,假设我已将源代码转换为语法树.我将通过什么过程将此语法树转换为汇编?

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

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

有人知道这样的资源吗?

谢谢 :)

Sam*_*ram 6

对编译器问题的强制性回应是阅读Dragon书(编译器:原理,技术和工具).当您说您已将源代码转换为语法树时,您究竟是什么意思?通常,解析的第一个阶段是创建抽象语法树(AST).下一步通常是归属.属性是AST中节点的属性,它们不一定与源语言有任何关系,但对于代码生成至关重要.通常,这里进行某种形式的类型检查以确定内存大小要求,并且在面向对象语言中,要调用哪些函数.例如,如果你的源是obj1 = obj2 + obj3,那么在你确定obj2的类型之前,你真的不知道该怎么做加号.

所以尽量回答你的问题.1)将源代码解析为AST.2)对AST的归属.3)生成中间代码(想象你指的是程序集).

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