2014-03-07 31 views
-1

我想设计一个'新'语言的编译器。新语言将有它自己的语法并输出一个有效的C代码。也就是说,生成ac代码从伪代码。我设计了一个grammar.perform递归下降解析,并得到了抽象语法树。例如,我得到了一个树,如果结构。如何映射到原始c代码?我可以执行顺序遍历吗?如何评估一个新的编程语言的抽象语法树

我读过Aho Ullman的书。解释器和编译的执行有什么区别? 我可以申请访客模式吗?

回答

2

与将其映射到机器码相同的方式,但输出C代替。这将使一些事情变得更容易(你可以利用C编译器的符号表而不是自己构建),有些事情更难(因为你必须以C接受的方式表达事物)。

请注意,在大多数情况下,您需要将抽象语法树转换为具体的语义树,除非两者在您的语言中几乎完全相同。

解释器只运行在实际正在执行的语义树的各个部分上,并可能重复地运行这些部分;它也在解释器的内存模型中操纵数据。编译器必须遍历整个语义树,并生成所有可能执行的代码;在一般情况下,它也必须生成一个完整的内存模型,但正如我所说的输出C会让你部分作弊。

龙书有这些问题的更详细的答案。基本上,你将C视为“高级汇编程序”。

+0

我的疑问是如何评估一个ast? – user3217708

+0

由于您在发明语言,因此您只需知道语法的每个组件的目标语义。您需要将语法映射到表示程序预期行为的表单中,以足够直接的方式,然后您可以从中解释或编译。 – keshlam

+0

在我的旧版Aho/Ullman中,您的问题从第7章“语法指导翻译”开始。使用AST生成IL(中间代码)表示。第8-11章提供了关于该过程的更多细节。您可以首先发布关于代码优化的章节12-14。第15章介绍如何使用IL来生成代码;那就是你将会适应输出C而不是汇编器或二进制对象代码文件的那个。 – keshlam