【问题标题】:Generate Python code from custom-designed Abstract Syntax Tree从定制设计的抽象语法树生成 Python 代码
【发布时间】:2014-05-06 22:16:48
【问题描述】:

有谁知道我可以用来从 AST 生成 Python 代码的工具吗?

我已经成功地编写了一个标记器和一个解析器,但我正在寻找一种更 Pythonic 的方式来从中生成 Python 代码。 我以前用过LLVMPY,我想知道是否有类似的东西可以用来生成Python代码而不是LLVM IR

我们将非常感谢您的建议 :-)

编辑

不是 Python AST。它来自我自己的语言,所以我知道没有一种工具可以神奇地理解它。我只是在寻找可以在生成Source Code 方面遇到我的东西。

例如:

不要连接字符串以产生a = 1 + 2,而是使用a = builder.add(1,2) 之类的东西。基本上任何可以让我免于手动生成字符串和处理缩进的痛苦的东西。有吗?

我已经有一个使用 AST 的类,但我发现自己不得不到处做这样的事情:

...
elif node.type == "Assign":
    _buffer = self.descend(node.args[0])
    _buffer += self.descend(node.args[1])
    _buffer += self.descend(node.args[2])
    return _buffer

elif node.type == "BinOp":
    _buffer = self.descend(node.args[1])
    _buffer += node.args[0]
    _buffer += self.descend(node.args[2])
    return _buffer
...

当我必须实现像 FunctionsClasses 这样的更大对象时,这变得更加流行。我只是想知道是否有更好的方法来做到这一点。

【问题讨论】:

  • 如果有帮助的话,标准 python 库中有 ast 模块。你检查过这个吗?
  • 我正在尝试从我为实验编写的玩具编程语言生成 Python 代码。我查看了那个模块,但看不出它有什么帮助。
  • 当您说“Python 代码”时,您是指文本源代码还是字节码?当您说“AST”时,您是指 Python 的 AST(在 ast 模块中实现)还是您自己语言的 AST?
  • 如果这是您自己的 AST,那么您将负责编写自己的 Python 代码生成器。通用工具无法理解您自己的特定 AST。
  • ... 关注标题中的问题,请参阅stackoverflow.com/q/3455456/120163 了解我真正希望您面临的问题。

标签: python compiler-construction abstract-syntax-tree


【解决方案1】:

有 python 模块ast 可以实现这一点。如果您正在做自己的 tokaniser,您可能只需要评估 ast 的评估器和评估 ast 的compile()。还有一个 unparser 从 ast 生成 python 代码,可以在 python 源代码库中找到。 unparse.py

【讨论】:

  • 在这个答案中肯定有一些指向正确方向的指针,但是对于@Sthe 提到的玩具语言,您对 Python AST 和 AST 没有任何区别。
  • 请注意unparse 模块的更新(Python 3 兼容)版本是here
  • 我认为 unparse.py 实际上是我要找的人。谢谢你的帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多