2012-02-23 50 views
13

我正在寻找一个Python导入过滤器或预处理器来处理源文件,这些源文件基本上是Python与额外的语言元素。目标是读取源文件,将其解析为抽象语法树,应用一些变换以实现语言的新部分,然后编写有效的Python源代码,然后由CPython使用它。我想用Python编写这个东西,并且为这个任务寻找最好的解析器。用于类Python语言的Python解析器

Python内置的解析器并不合适,因为它要求源文件是实际的Python,而这些不是。有大量的解析器(或解析器生成器)可以与Python一起工作,但很难分辨哪个是最适合我的需求而无需大量研究的。

总之,我的要求是:

  1. 分析器是用Python写的或有Python绑定。
  2. 附带一个我可以调整的Python语法,或者可以轻松使用其他地方可用的可调整Python语法(如http://docs.python.org/reference/grammar.html)。
  3. 转换后可以重新序列化AST。
  4. 应该不太可怕,不能用API来工作。

有什么建议吗?

+0

只是要清楚:你要解析的语言甚至不*解析*为纯Python。正确? – 2012-02-23 20:09:45

+0

您考虑过研究PyYAML吗? – inspectorG4dget 2012-02-23 20:17:52

+0

@SvenMarnach:这是正确的。 – kindall 2012-02-23 20:17:57

回答

9

首先想到的是lib2to3。它是一个完整的Python解析器的纯Python实现。它读取一个Python语法文件并根据此语法解析Python源文件。它提供了一个用于执行AST操作并写回格式良好的Python代码的良好基础结构 - 毕竟它的目的是在两种Python语言之间转换,但语法略有不同。

不幸的是,它缺少文档,不能保证稳定的接口。尽管如此,仍然有些项目建立在lib2to3之上,并且source code非常易读。如果API的稳定性是一个问题,你可以分叉它。

+1

好点! “毕竟它的目的是在两种Python语言之间转换,但语法略有不同” – 2012-02-23 23:00:10

+0

在这里得到了两个很好的答案,但这显然是我应该先尝试的方法。 – kindall 2012-02-24 04:23:20

2

我喜欢SimpleParse很多,但我从来没有试图喂它Python grammar(顺便说一句,这是一个确定性的语法?)。如果它窒息,PLY将完成这项工作。

看到这个compilation关于Python解析工具。

+0

*顺便说一句,它是一种确定性语法吗?是的(并且非常简单)。 – 2012-02-23 20:48:52

1

我建议你看看我的图书馆:https://github.com/erezsh/lark

它可以分析所有的上下文无关文法,自动生成的AST(与线&列号),并接受EBNF格式,它是语法考虑了标准。

它可以轻松地解析像Python这样的语言,并且它可以比使用Python编写的任何其他解析库更快。

事实上,有已经是一个example python grammarparser