2014-06-27 47 views
2

我正在研究编程语言的编译器,并以抽象语法树(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以执行语义检查。

+0

在这里你问“*如何做*”....在评论中可能会回答下面,你说“也许我需要将AST转换成其他代表”,就好像你不相信。这是什么? –

回答

0

人们可以用任何喜欢的方式来表示程序;你可以完全使用树来编译编译器。代表的目的是为了便于收集某些事实;该表示用于使这些具体事实的收集/处理更容易。因此,人们期望程序的表示在编译的不同阶段发生变化,这取决于编译器在该阶段试图达到的目标。

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

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

,你似乎不知道这个事实,意味着你没有做你的功课。这在编译器书籍中有很好的描述。读一个。

+2

我认为我已经提出了足够抽象的问题,以便这些答案不会出现。想想它,好像我在问如何从AST到三倍。我拿出了龙书,在第513页的代码生成章节中,它谈到了三元组,但不知道如何从AST中获得。 – Dess

+0

我的副本(1986,Aho/Sethi/Ullman)在第468-470页“语法指导翻译为3地址代码”中有一节。如果这对您不适用,请尝试使用Google地址代码搜索“3代地址”,并阅读维基百科文章以及PDF幻灯片,了解如何执行此操作。你还想要什么?我认为你没有完成你的功课。 –

+1

我会编辑这篇文章,让它更清楚我以后的内容。我不是在寻找a + b + c应该变成的解释:t1 = add a,b; t2 =加t1,c;我正在寻找*如何做到这一点。这类似于询问如何从源语言到语义分析:将源语言转换为AST并对AST执行分析。这是一种适用于任何源语言的通用性。不过,我很欣赏你正在努力提供帮助。 – Dess