自动代码生成通常通过以下方式完成:打印包含代码片段的语句
带占位符的文本模板(考虑宏)
IMHO,更好的做法是:为目标片段构建AST,然后预打印
几乎没有人做后者,因为工具大多不在那里。
Python的2to3工具提供(我认为)目标AST和预打印。
但你没有问的问题是“从什么产生?”无论如何你必须说明
抽象地说,你想产生什么(或者它不是一个胜利)。你的工具必须能够以某种方式阅读规范。
许多代码生成方案由编写调用上述生成机制的过程代码组成;过程代码充当隐式规范。阅读规范是“容易的”;它只是代码生成器使用的语言中的代码。
一些代码生成方案使用某种图形结构来提供一个框架,在该框架上挂起规范的片段,从而驱动代码生成。UML类图是一个典型的例子。这些方案并不那么容易;你需要一个“规范读取器”(例如,UML图读取器,又名XMI或其他类似的读取器,或者如果你不使用UML,某种规范解析器),然后你需要一些东西,以某种有用的顺序(UML是图,有很多不同的访问方式)爬过刚刚读取的规范,进行调用关于代码生成步骤。
Python 2to3工具使用Python2解析器读取“spec”。如果您想从Python2生成代码,那就可以了。我想你不想那样做。
最佳实践方法是将读取/分析/遍历规范的能力与为目标语言生成AST的能力结合起来的方法。
我们的DMS Software Reengineering Toolkit是一个通用的程序分析和转换系统。它将“规范”(您可以定义的语法实例)解析为AST;它还允许您使用过程代码(如上面所示)或使用模式匹配/替换(DMS非常独特)为这些语法中的任何一个构建任意的AST。DMS langauge前端的一部分是prettyprinter,它可以从AST重新生成文本(通过往返代码测试:parse to AST,prettyprint AST,better be the same text)。
如果DMS不知道您的语法,它有非常好的解析器和预打印生成器,以及其他分析程序的支持机制。所有这些额外的机制通常都不适用于经典的解析器生成器,或者仅仅是一个简单的“AST”包。(我不知道2to3里面是什么)。
因此,您可以使用DMS解析您的规范,并使用ASTs生成Python代码,最后是prettyprinting。