从 AST 生成代码的最佳设计?
2022-09-01 21:10:08
我正在研究一个非常复杂的DSL,我想把它编译成几种高级语言。整个过程是一次学习经历。编译器是用java编写的。
我想知道是否有人知道代码生成器部分设计的最佳实践。我目前已将所有内容解析为抽象语法树。
我正在考虑使用模板系统,但我还没有研究这个方向太久,因为我想先从堆栈溢出中听到一些智慧。
谢谢!
我正在研究一个非常复杂的DSL,我想把它编译成几种高级语言。整个过程是一次学习经历。编译器是用java编写的。
我想知道是否有人知道代码生成器部分设计的最佳实践。我目前已将所有内容解析为抽象语法树。
我正在考虑使用模板系统,但我还没有研究这个方向太久,因为我想先从堆栈溢出中听到一些智慧。
谢谢!
你真正想要的是一个程序转换系统,它将一种语言(你的DSL)中的语法结构映射到其他语言中的语法模式。这样的工具可以在代码生成项目期间执行任意转换(树重写概括字符串重写,这些字符串重写是具有完全图灵功能的Post系统),这意味着您生成的内容以及生成过程的复杂程度仅取决于您的野心,而不是由“代码生成器框架”属性决定。
复杂的程序转换系统结合了各种类型的范围界定、流程分析和/或自定义分析器,以实现转换。这并没有增加任何理论力量,但它增加了很多实际能力:大多数真正的语言(甚至是DSL)都有命名空间,控制和数据流,需要类型推断等。
我们的DMS软件再造工具包就是这种类型的转换系统。它已被用于分析/转换传统语言和DSL,用于简单和复杂语言,以及小型,大型甚至大型软件系统。
与OP关于“将AST转换为其他语言”的评论有关,这是由DMS通过编写转换来完成的,这些转换将DSL的表面语法(在幕后实现他的DSL的AST)映射到目标语言的表面语法(使用目标语言AST实现)。然后,生成的目标语言AST由DMS自动打印,以提供与目标AST相对应的目标语言的实际源代码。