我正在编写一种编程语言的编译器,并且我以抽象语法树(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以执行语义检查。
答案 0 :(得分:-3)
人们可以用任何方式代表节目;你可以完全使用树构建编译器。陈述的目的是使收集某些事实变得容易;该表示用于使这些特定事实的收集/处理更容易。因此,我们希望程序的表示在编译的不同阶段发生变化,这取决于编译器在该阶段试图实现的目标。
一个典型的方案是通过这些表示来翻译程序以产生最终代码:
* ASTs
* Triples
* Abstract machine instructions
* Concrete machine instructions
你似乎不知道这一点,这意味着你没有完成你的功课。这在编译器书籍中有很好的描述。去读一读。