65

人们可以向我指出有关使用 Python 进行词法分析、解析和标记化的资源吗?

我正在对一个开源项目 ( hotwire ) 进行一些修改,并希望对输入其中的命令进行lexesparse 和 tokenise的代码进行一些更改。由于它是真正的工作代码,它相当复杂并且有点难以解决。

我以前没有处理过 lex/parse/tokenise 的代码,所以我想一种方法是在这方面完成一两个教程。我希望能学到足够的知识来浏览我真正想要更改的代码。有什么适合的吗?(理想情况下可以在一个下午完成,而不必先购买和阅读龙书……)

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

那么有人能指点我一个教程,我可以从头开始构建一个基本的解析器,只使用 python 吗?

4

8 回答 8

38

我是PLY的快乐用户。它是 Lex 和 Yacc 的纯 Python 实现,具有许多小细节,使其非常 Python 化且易于使用。由于 Lex & Yacc 是最流行的词法分析工具,并且被用于最多的项目,PLY 具有站在巨人肩膀上的优势。Lex & Yacc 上有很多在线知识,您可以自由地将其应用于 PLY。

PLY 还有一个很好的文档页面,其中包含一些简单的示例来帮助您入门。

有关大量 Python 解析工具的列表,请参阅.

于 2008-09-20T05:07:57.413 回答
31

这个问题已经很老了,但也许我的回答会对想要学习基础知识的人有所帮助。我觉得这个资源非常好。它是一个用 python 编写的简单解释器,无需使用任何外部库。因此,这将有助于任何想了解解析、词法分析和标记化的内部工作的人:

“Python 中从零开始的简单解释器:”第 1部分、第 2部分、 第 3 部分第 4 部分

于 2013-01-14T08:36:04.053 回答
19

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

>>> 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 风格的注释。

于 2008-09-26T01:05:35.700 回答
6

pygments是一个用 python 编写的源代码语法高亮器。它具有词法分析器和格式化程序,并且可能对查看源代码很有趣。

于 2008-09-20T05:15:57.613 回答
5

这里有几件事可以帮助您入门(大致从最简单到最复杂,从最小到最强大):

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 级大学课程中。我们做了一些手工解析的任务;如果您想真正了解幕后发生的事情,我建议您采用相同的方法。

这不是我用的书,但还不错:《编译器设计原理》

希望这足以让你开始:)

于 2008-11-11T01:13:42.507 回答
5

查看标准模块shlex并修改它的一个副本以匹配您用于 shell 的语法,这是一个很好的起点

如果您想要一个完整的词法分析/解析解决方案的所有功能,ANTLR也可以生成 python。

于 2008-08-31T17:14:06.990 回答
3

我建议http://www.canonware.com/Parsing/,因为它是纯 python 并且您不需要学习语法,但它没有被广泛使用,并且文档相对较少。重量级的是 ANTLR 和 PyParsing。ANTLR 也可以生成 java 和 C++ 解析器,以及 AST walkers,但你必须学习什么相当于一门新语言。

于 2008-08-31T23:14:54.283 回答
3

弗雷德里科·托马塞蒂(Frederico Tomassetti)对从 BNF 到二进制解密相关的所有事情进行了很好(但简短)的简明写作:

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

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

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

于 2019-01-05T21:13:57.103 回答