Python中用于词法分析、标记化和解析的资源

65

请给我提供一些关于使用Python进行词法分析、语法分析和标记化的资源。

我正在对一个开源项目 (hotwire) 进行一些小修改,并想要更改其命令输入时所使用的代码 lexes, parses and tokenises。由于这是真正的工作代码,因此相当复杂且有点难以理解。

我之前没有编写过词法分析/语法分析/标记化代码,因此我想通过学习一两个相关教程来解决这个问题。我希望学到足够的知识,以便能够浏览我实际想要更改的代码。是否有适合的教程?(最好可以在一个下午内完成,而无需购买并阅读《龙书》...)

编辑:(2008年10月7日)以下回答都没有完全给出我想要的内容。通过它们,我可以从头开始生成解析器,但我想学习如何从头开始编写自己的基本解析器,而不使用类似 lex 和 yacc 的工具。在做到这一点之后,我就可以更好地理解现有代码。

因此,是否有人可以指导我学习如何使用Python从头构建基本解析器的教程?

8个回答

38

我很高兴使用PLY。它是一个纯Python实现的Lex & Yacc,有许多小巧的细节使其非常符合Python风格且易于使用。由于Lex & Yacc是最流行的词法分析和语法分析工具,并被用于大部分项目中,因此PLY具有站在巨人肩膀上的优势。关于Lex & Yacc,已经存在许多在线知识资源,你可以自由地将其应用到PLY中。

PLY还有一个很好的文档页面,其中包含一些简单的例子,可以帮助你入门。

如果想了解更多Python解析工具,请查看此链接


2
我也推荐PLY,它非常棒。 - mipadi

33

这个问题很旧了,但也许我的答案可以帮助想学习基础的人。我发现这个资源非常好。这是一个用Python编写的简单解释器,没有使用任何外部库。所以这将有助于任何想要了解解析、词法分析和标记化内部工作原理的人:

"从头开始用Python编写一个简单的解释器:" 第1部分第2部分第3部分第4部分


6
非常好的一系列文章,重点关注目标而非工具! - Janus
词法分析器很简单、很棒。而解析器则太过复杂。 - WhyWhat

19
对于中等复杂度的语法,PyParsing非常出色。您可以直接在Python代码中定义语法,无需进行代码生成:

PyParsing

>>> from pyparsing import Word, alphas
>>> greet = Word( alphas ) + "," + Word( alphas ) + "!" # <-- grammar defined here
>>> hello = "Hello, World!"
>>>> print hello, "->", greet.parseString( hello )
Hello, World! -> ['Hello', ',', 'World', '!']

(本例摘自 PyParsing 主页。)

利用解析操作(当某个语法规则被触发时调用的函数),您可以将解析直接转换为抽象语法树或任何其他表示形式。

有许多辅助函数,封装了反复出现的模式,如运算符层次结构、带引号的字符串、嵌套或 C 风格的注释。


4
就我个人而言,我一直对 PyParsing 有些困难。我曾尝试过几次使用它,但从来没有完全满意过结果(例如,花费了很长时间、难以调试、需要更多的代码等)。不过,我无法确定这是由于我的无知,还是 PyParsing 本身的问题…… - David Wolever
1
链接已失效,如果您能更新一下就太好了。 - luator

7

Pygments 是一个用 Python 编写的源代码语法高亮器。它有词法分析器和格式化程序,对于查看源代码可能会很有趣。


7

以下是一些帮助您入门的内容(大致按照从简单到复杂,从弱到强的顺序):

http://en.wikipedia.org/wiki/Recursive_descent_parser

http://en.wikipedia.org/wiki/Top-down_parsing

http://en.wikipedia.org/wiki/LL_parser

http://effbot.org/zone/simple-top-down-parsing.htm

http://en.wikipedia.org/wiki/Bottom-up_parsing

http://en.wikipedia.org/wiki/LR_parser

http://en.wikipedia.org/wiki/GLR_parser

当我学习这个东西时,是在一个学期长的400级大学课程中。我们做了很多手动解析的作业;如果你想真正理解底层发生的事情,我建议采用同样的方法。
这不是我使用的书,但它非常好:编译器设计原理
希望这足以让你开始 :)

10
知道所有这些东西有什么用处呢?如果他正在寻找Python的实现,这有何帮助? - Alexander Oh

5

请看标准模块shlex,并修改其中一个副本以匹配您的shell语法,这是一个很好的起点。

如果您想要完整解决方案的所有功能进行词法分析/语法分析,则ANTLR也可以生成Python代码。


ANTLR 的链接已失效。 - Ekrem Dinçel

4

Frederico Tomassetti写了一篇简洁的文章,涵盖了BNF到二进制解密的所有相关内容:

  • 词法分析器,
  • 语法分析器,
  • 抽象语法树(AST)和
  • 构造器/代码生成器。

他甚至提到了新的Parsing Expression Grammar(PEG)。

https://tomassetti.me/parsing-in-python/


3

我建议使用http://www.canonware.com/Parsing/,因为它是纯Python的,您不需要学习语法,但它并没有被广泛使用,并且文档相对较少。重量级的工具有ANTLR和PyParsing。ANTLR还可以生成Java和C++解析器以及AST遍历器,但您将需要学习相当于一种新语言。


我打开不了这个链接。 - Ekrem Dinçel

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