Python 代码生成器

27

我希望能够根据AST描述生成Python代码。

我已经对C进行了静态分析,并在Python中构建了AST访问器,因此我相对于操作语法树还是比较自信的,但我从未尝试过代码生成,并正在尝试确定生成Python代码的最佳实践。

具体来说,我希望了解自动代码生成通常是如何完成的,或者任何针对Python的库能够使这个任务更简单。

我的最终目标是尝试类似于csmith或用于使Python代码符合PEP8的工具。


你是使用自定义AST,还是创建Python AST(例如使用ast模块)? - Some programmer dude
很可能是使用ast模块的Python AST。我注意到ANTLR已经稍微适应了Python,这似乎是一种可行的方法,但坚持使用Python内部似乎更明智。 - mvanveen
2个回答

19
你可以尝试使用Python代码开发人员开发的2to3工具,将Python 2代码自动转换为Python 3代码。该工具首先将代码解析为树形结构,然后从树形结构中输出“已修复”的Python 3代码。
这可能是个不错的起点,因为这是一个由核心开发人员认可的“官方”Python工具,并且是推荐的Python 2到3迁移路径的一部分。
另一种方法是查看codegen.py模块,该模块可以从Python的ast生成Python代码。
此外,也可以参考这个 SO问题 ,可能与你的问题相关(我没有标记为重复,因为我不确定问题范围是否完全重叠)。

5

自动生成代码通常有以下几种方式:

  • 包含代码片段的打印语句
  • 带有占位符的文本模板(类似宏)

在我看来,更好的做法是:

  • 为目标片段构建AST,然后进行漂亮打印

很少有人这样做,因为大多数工具都没有。

Python的2to3工具提供了(我认为)目标AST和漂亮打印。

但一个你没有问到的问题是“从什么生成?”你必须以抽象的方式指定要生成的内容(否则就不是赢了)。你的工具必须以某种方式能够读取该规范。

许多代码生成方案由调用上述生成机制的过程化代码编写而成;过程化代码充当隐式规范。阅读规范很“容易”;它只是代码生成器使用的语言中的代码。

一些代码生成方案使用某种图形结构来提供框架,以便挂载规范的片段,从而驱动代码生成。UML类图是一个经典的例子。这些方案并不容易实现,你需要一个“规范阅读器”(例如UML图表阅读器,也称为XMI或类似工具,或者如果你不使用UML,则需要某种规范解析器),然后你需要按照某种有用的顺序遍历刚刚读取的规范(UML是图形,可以有许多不同的访问方式),从而在代码生成步骤中进行调用。
Python 2to3工具使用Python2解析器来读取“规范”。如果你想从Python2生成代码,那么这将没问题。我怀疑你不想这样做。
最佳实践方法是将读取/分析/遍历规范的能力与为目标语言生成AST的能力统一起来。
我们的DMS软件重构工具包是一个通用的程序分析和转换系统。它将“规范”(您可以为其定义语法的实例)解析为AST;它还允许您使用过程性代码(如上所述)或使用模式匹配/替换(几乎是DMS独有的)来构建任意这些语法的AST。 DMS语言前端的一部分是漂亮的打印机,可以从AST重新生成文本(这些通过往返代码进行测试:解析为AST,漂亮地打印AST,最好是相同的文本)。
如果您的语法不为DMS所知,则它具有极好的解析器和漂亮的打印机生成器,以及其他支持程序分析的机制。所有这些额外的机制通常在经典解析器生成器中不可用,或者仅在纯“AST”包中提供。(我不知道2to3中有什么)。
这与Python相关的原因是,DMS有一个Python前端以及许多其他语言的语法结构。因此,您可以使用DMS来解析您的规范,并使用AST生成Python代码,最后进行漂亮的打印。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接