【问题标题】:How to go from AST to backend code?如何从 AST 转到后端代码?
【发布时间】: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 转换为其他表示“好像你不相信一样。是哪个?

标签: abstract-syntax-tree


【解决方案1】:

人们可以用任何自己喜欢的方式来表示程序;您可以完全使用树构建编译器。陈述的目的是使收集某些事实变得容易;该表示有助于更轻松地收集/处理这些特定事实。因此,人们期望程序的表示在编译的不同阶段会发生变化,具体取决于编译器在该阶段试图实现的目标。

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

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

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

【讨论】:

  • 我认为我的问题已经足够抽象,以至于不会出现这类答案。把它想象成我在问如何从 AST 到三元组。我拿出我的 Dragon Book,在第 513 页的代码生成章节中,它谈到了三元组,但没有谈到如何从 AST 到达那里。
  • 我将编辑帖子以更清楚地说明我的目标。我不是在寻找 a + b + c 应该变成的解释: t1 = add a, b; t2 = 添加 t1, c;我正在寻找如何 去做。这类似于询问如何从源语言到语义分析:将源语言转换为 AST 并在 AST 上执行分析。这是适用于任何源语言的普遍性。不过,我非常感谢您尝试提供帮助。
  • 是的,我做到了。我还看了你在书中提到的部分(我有相同的版本)。不幸的是,这些都是对不同问题的好答案。
  • 你知道,也许我的问题只是令人困惑。我的基本问题是直接从 AST 输出代码感觉像是转换的一大飞跃。也许我正在回答我自己的问题:也许我确实需要在输出阶段之前将 AST 转换为其他中间表示。
  • 你了解什么是“语法定向翻译”吗?你了解它是如何实现的吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-16
  • 2012-05-25
  • 2010-09-06
  • 2013-12-13
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多