【发布时间】:2014-06-27 17:27:31
【问题描述】:
我正在开发一种编程语言的编译器,并且我以抽象语法树 (AST) 的形式很好地表示了源语言。我尝试通过遍历 AST 直接生成后端代码,但效果不佳。通常,考虑将类似 C 语言的 AST 映射到类似汇编语言。我现在认为我缺少从 AST 到后端代码的某个阶段。问题是从 AST 到下一个表示(例如,3-address code)是粗糙的。感觉就像我错过了中间的一步。
[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-address:
t1 = add a, b
t2 = add t1, c
set x, t2
我要求如何提供技术/指导/经验。
举一个我正在寻找的答案类型的示例:
问题:我可以采取哪些步骤对源语言进行语义分析?
答案:将语言解析为 AST 并遍历 AST 进行语义检查。
【问题讨论】:
-
在这里你问“如何 去做”......在 cmets 中可能会在下面回答,你说“也许我确实需要将 AST 转换为其他表示“好像你不相信一样。是哪个?