在Python中用于lexing,令牌化和parsing的资源

人们可以指向我的资源用Python来解释和分词吗?

我在一个开源项目( hotwire )上做了一些攻击,希望对代码进行一些修改,对input的命令进行词法分析和标记 。 由于它是真正的工作代码,所以它相当复杂,难以解决。

我之前没有研究过lex / parse / tokenise的代码,所以我想一种方法是通过一两个教程来解决这个问题。 我希望能够学习足够的知识来浏览我实际想要改变的代码。 那里有什么合适的吗? (理想情况下,可以在一个下午完成,而不必先购买和阅读龙书…)

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

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

我是PLY的一个快乐的用户。 它是Lex&Yacc的一个纯Python实现,具有许多细小的细节,使它变得非常容易使用。 由于Lex&Yacc是最受欢迎的lexing&parsing工具,并被用于大多数项目,PLY的优势在于站在巨人的肩膀上。 Lex&Yacc在线上存在大量的知识,您可以将其自由应用于PLY。

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

有关很多Pythonparsing工具的列表,请参阅本文 。

对于中等复杂的语法, 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主页取得的例子)。

通过parsing操作(触发特定语法规则时调用的函数),可以将parsing直接转换为抽象语法树或任何其他表示forms。

有许多帮助函数封装了循环模式,如操作符层次结构,带引号的string,嵌套或C风格的注释。

这个问题是相当古老的,但也许我的答案会帮助谁想要学习的基础知识。 我觉得这个资源非常好。 这是一个简单的解释器,用python编写而不需要使用任何外部库。 因此,这将有助于任何人想要了解分析,search和标记化的内部工作:

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

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

如果你想要一个完整的解决scheme的力量/parsing, ANTLR也可以生成python。

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

这里有几件事情可以让你开始(粗略地说,从最简单到最复杂,最less到最强大):

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级大学课程。 我们做了一些手工parsing的任务, 如果你想真正理解发生了什么,我会推荐相同的方法。

这不是我使用的书,但它是相当不错的: 编译器devise的原则 。

希望这足以让你开始:)

我build议http://www.canonware.com/Parsing/ ,因为它是纯粹的Python,你不需要学习语法,但它没有被广泛使用,并有相对较less的文档。 重量级是ANTLR和PyParsing。 ANTLR也可以生成Java和C ++parsing器,AST步行者,但是你必须要学习什么相当于一种新的语言。