如何从AST到后端代码?

时间:2014-06-27 17:27:31

标签: abstract-syntax-tree

我正在编写一种编程语言的编译器,并且我以抽象语法树(AST)的形式很好地表示了源语言。我尝试通过遍历AST直接生成后端代码,但这并不能很好地工作。一般来说,可以考虑将类似C语言的AST映射到类似汇编的语言。我现在认为,从AST到后端代码,我缺少一些阶段。问题是从AST到下一个表示(例如,3地址代码)是有争议的。感觉就像我失踪之间有一个步骤。

[source lang] -> [lex/parse]-> [AST] -> [semantic analysis] -> [?] -> [backend code]

这是我在思考时想出来的:

1)将源语言的AST转换为代表后端的AST。这意味着我需要有2个不同的AST。然后,从转换后的AST中输出后端。

2)将AST转换为不同类型的数据结构,并基于该其他结构生成后端代码。我不确定这个结构会是什么。

3)以不同的方式(从用于打印它的方式)遍历AST以生成后端代码。这就是我首先尝试这样做的方法,但它看起来并不正确;我觉得这是一种破解方式。

我有哪些选择从AST到后端代码?

请注意,我不会询问AST可以转换为什么类型的表示,例如3地址代码。例如,我理解C添加如此:

x = a + b + c

可以像这样变成3地址:

t1 = add a, b
t2 = add t1, c
set x, t2

我要求如何进行技术/指导/经验。

举一个我正在寻找的答案类型的例子:

问题:我可以采取哪些步骤对源语言进行语义分析?

答案:将语言解析为AST并遍历AST以执行语义检查。

1 个答案:

答案 0 :(得分:-3)

人们可以用任何方式代表节目;你可以完全使用树构建编译器。陈述的目的是使收集某些事实变得容易;该表示用于使这些特定事实的收集/处理更容易。因此,我们希望程序的表示在编译的不同阶段发生变化,这取决于编译器在该阶段试图实现的目标。

一个典型的方案是通过这些表示来翻译程序以产生最终代码:

 *  ASTs
 *  Triples
 *  Abstract machine instructions
 *  Concrete machine instructions

你似乎不知道这一点,这意味着你没有完成你的功课。这在编译器书籍中有很好的描述。去读一读。