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

Resources for lexing, tokenising and parsing in python

提问人:Hamish Downer 提问时间:9/1/2008 最后编辑:Hamish Downer 更新时间:5/22/2020 访问量:42975

问:

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

我正在对一个开源项目(hotwire)进行一些黑客攻击,并想对代码进行一些更改,以对输入到其中的命令进行词法化、解析和标记化。由于它是真正的工作代码,因此它相当复杂且有点难以处理。

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

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

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

Python 解析 资源 Lex

评论


答:

5赞 PW. 9/1/2008 #1

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

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

评论

0赞 Ekrem Dinçel 5/6/2020
ANTLR 链接已失效。
3赞 nimish 9/1/2008 #2

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

评论

0赞 Ekrem Dinçel 5/6/2020
我无法打开链接。
38赞 Eli Bendersky 9/20/2008 #3

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

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

有关许多 Python 解析工具的列表,请参阅此处

评论

2赞 mipadi 11/11/2008
我支持对 PLY 的建议,这很棒。
7赞 nilamo 9/20/2008 #4

pygments 是用 Python 编写的源代码语法高亮器。它有词法分析器和格式化程序,窥视源代码可能会很有趣。

19赞 Torsten Marek 9/26/2008 #5

对于中等复杂的语法,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 样式的注释。

评论

4赞 David Wolever 9/11/2010
值得一提的是,我一直在使用 PyParseing 时遇到麻烦。我尝试过几次使用它,但从未对结果完全满意(例如,它花费了很长时间,难以调试,需要比我预期的更多的代码等)。不过,我不能说这是由于我的无知还是 PyParse 的失败......
1赞 luator 10/8/2018
链接已死,如果您可以更新它,那就太好了。
7赞 Tony Arkles 11/11/2008 #6

以下是一些可以帮助您入门的内容(大致从最简单到最复杂,从最不强大到最强大):

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赞 Alexander Oh 3/25/2013
这如何帮助那些知道所有这些东西,但正在寻找 Python 实现的人?
33赞 Saad 1/14/2013 #7

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

“Python 中从头开始的简单 Intepreter:”第 1 部分、第 2 部分、第 3 部分和第 4 部分

评论

6赞 Janus 9/24/2013
非常好的系列文章,重点是目标而不是工具!
0赞 WhyWhat 10/19/2022
Lexer简单而漂亮。解析器太复杂了。
4赞 John Greene 1/6/2019 #8

弗雷德里科·托马塞蒂(Frederico Tomassetti)对从BNF到二进制破译的所有相关内容进行了很好的(但简短)简明扼要的文章:

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

他甚至提到了新的解析表达式语法(PEG)。

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