从 AST 生成代码的最佳设计?

我正在研究一个非常复杂的DSL,我想把它编译成几种高级语言。整个过程是一次学习经历。编译器是用java编写的。

我想知道是否有人知道代码生成器部分设计的最佳实践。我目前已将所有内容解析为抽象语法树。

我正在考虑使用模板系统,但我还没有研究这个方向太久,因为我想先从堆栈溢出中听到一些智慧。

谢谢!


答案 1

当我在编程语言课上这样做时,我们最终使用了基于遵循访问者模式的发射器。它运行得很好 - 只要你的AST与你正在打印的内容相当匹配,就可以很容易地将其重定向到新的输出语言。


答案 2

你真正想要的是一个程序转换系统,它将一种语言(你的DSL)中的语法结构映射到其他语言中的语法模式。这样的工具可以在代码生成项目期间执行任意转换(树重写概括字符串重写,这些字符串重写是具有完全图灵功能的Post系统),这意味着您生成的内容以及生成过程的复杂程度仅取决于您的野心,而不是由“代码生成器框架”属性决定。

复杂的程序转换系统结合了各种类型的范围界定、流程分析和/或自定义分析器,以实现转换。这并没有增加任何理论力量,但它增加了很多实际能力:大多数真正的语言(甚至是DSL)都有命名空间,控制和数据流,需要类型推断等。

我们的DMS软件再造工具包就是这种类型的转换系统。它已被用于分析/转换传统语言和DSL,用于简单和复杂语言,以及小型,大型甚至大型软件系统。

与OP关于“将AST转换为其他语言”的评论有关,这是由DMS通过编写转换来完成的,这些转换将DSL的表面语法(在幕后实现他的DSL的AST)映射到目标语言的表面语法(使用目标语言AST实现)。然后,生成的目标语言AST由DMS自动打印,以提供与目标AST相对应的目标语言的实际源代码。


推荐