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

Sam*_*urn 20 java dsl code-generation abstract-syntax-tree

我正在开发一个非常复杂的DSL,我想将其编译成几种高级语言.整个过程一直是学习的经历.编译器是用java编写的.

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

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

谢谢!

Ste*_*ker 9

当我在编程语言课程中执行此操作时,我们最终使用基于访问者模式的发射器.它工作得很好 - 只要你的AST与你打印的相当匹配,就可以很容易地将它重新定位到新的输出语言.

  • 访客有效,但原始。您是否看过Stratego / XT之类的东西? (2认同)

Ira*_*ter 6

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

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

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

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