我正在研究编程语言的编译器,并以抽象语法树(AST)的形式很好地表示源语言。我尝试通过遍历AST直接生成后端代码,但那不太好。一般来说,想象一下将类似C语言的AST映射到汇编语言。我现在认为,我错过了从AST到后端代码的某个阶段。问题在于,从AST到下一个表示(比如3位地址代码)是成熟的。感觉就像我失去了一步。如何从AST转到后端代码?
[source lang] -> [lex/parse]-> [AST] -> [semantic analysis] -> [?] -> [backend code]
这是我想出一边想着它:
1)转换的源语言的AST,以表示后端的AST。这意味着我需要有2个不同的AST。然后,从转换的AST输出后端。
2)将AST转换为不同类型的数据结构,并根据其他结构生成后端代码。我不确定这个其他结构是什么。
3)以不同的方式(从用于漂亮地打印它的方式)来生成后端代码。这是我先试着做的,但看起来并不正确;我觉得这是一个骇人的方式去做。
从AST到后端代码我有什么选择?
请注意,我不问AST可以转换成什么样的表示形式,例如3地址代码。例如,据我所知,一个C除了像这样:
x = a + b + c
可以变成3地址,像这样:
t1 = add a, b
t2 = add t1, c
set x, t2
我要求的技术/引导/经验上如何到做到这一点。
为了给答案的,我正在寻找将是类型的例子:
问:我可以采取什么步骤来源朗进行语义分析?
答案:将语言解析为AST并遍历AST以执行语义检查。
在这里你问“*如何做*”....在评论中可能会回答下面,你说“也许我需要将AST转换成其他代表”,就好像你不相信。这是什么? –