首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python代码生成器

Python代码生成器
EN

Stack Overflow用户
提问于 2011-10-25 13:59:47
回答 2查看 11K关注 0票数 25

我希望能够在给定AST描述的情况下执行python代码生成。

我已经对C进行了静态分析,并用python构建了AST访问者,所以我对操作语法树相对比较舒服,但我以前从未尝试过代码生成,正在尝试确定生成python代码的最佳实践。

具体地说,我喜欢关于自动代码生成通常是如何完成的指针,或者任何指向python的库的指针,它们可以使这项任务变得更简单。

我的最终目标是尝试类似于csmith或使python代码与PEP8兼容的工具。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-25 15:41:30

您可能想看看2to3工具,该工具由Python code devs开发,用于自动将Python2代码转换为Python3代码。该工具首先将代码解析为一棵树,然后从该树中输出“修复的”Python3代码。

这可能是一个很好的起点,因为这是核心开发人员认可的“官方”Python工具,也是推荐的Python2到3迁移路径的一部分。

或者,查看codegen.py module,它从Python的ast生成Python代码。

另请参阅此SO question,它可能与您的问题相关(我不会将其标记为副本,因为我不确定问题的范围是否100%重叠)

票数 17
EN

Stack Overflow用户

发布于 2012-03-30 01:13:10

自动代码生成通常通过以下方式完成:

  • 打印包含代码片段的语句

带有占位符的

  • 文本模板(想想宏)

我想,更好的做法是:

  • 为目标片段构建了一个AST,然后漂亮地打印了

几乎没有人做后者,因为工具大多不在那里。

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

但是你没有问的一个问题是:“从什么生成?”以某种方式,你必须抽象地指定你想要生成什么(否则就不是胜利)。而且您的工具必须能够以某种方式读取该规范。

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

一些代码生成方案使用某种图形结构来提供一个框架,在该框架上挂起了驱动代码生成的规范片段。UML类图就是一个典型的例子。这些方案并不容易;您需要一个“规范阅读器”(例如,UML图表阅读器,又名XMI或类似的工具,或者如果您没有使用UML,某种规范解析器),然后您需要一些东西来以某种有用的顺序(UML就是图形,有许多不同的方式可以访问它)在代码生成步骤中调用刚刚读取的规范。

Python2to3工具使用Python2解析器来读取“规范”。如果您希望从Python2生成代码,这将是很好的。我怀疑你不想这么做。

最佳实践方法是将读取/分析/遍历规范的能力与为目标语言生成AST的能力统一起来。

我们的DMS Software Reengineering Toolkit是一个通用的程序分析和转换系统。它将“规范”(您可以为其定义的语法实例)解析为as;它还允许您使用上面勾画的过程代码或使用模式匹配/替换(DMS非常独特)为这些语法中的任何一个构建任意的as。DMS langauge前端的一部分是一个漂亮的打印机,可以从AST重新生成文本(这些都是通过往返代码测试的: parse to AST,prettyprint,最好是相同的文本)。

如果DMS不了解您的语法,它有非常好的解析器和漂亮的打印机生成器,以及用于分析程序的其他支持机制。所有这些额外的机制通常不适用于传统的解析器生成器,或者仅仅是一个简单的"AST“包。(我不知道2to3中是什么)。

与Python相关的是,DMS既有grammars for many other languages,也有Python front end

因此,您可以使用DMS解析您的规范,并使用AST生成Python代码,最后生成漂亮的打印。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7885254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档