在python中进行词法分析,标记化和解析的资源

时间:2020-03-05 18:45:41  来源:igfitidea点击:

人们能否指出我关于使用Python进行词法分析,解析和标记化的资源?

我正在对开放源代码项目(hotwire)进行一些黑客操作,想对对输入到其中的命令进行语法分析,解析和标记化的代码进行一些更改。由于它是真正的工作代码,因此相当复杂并且很难解决。

我之前没有研究过lex / parse / tokenise的代码,因此我想一种方法是在这方面完成一两个教程。我希望学习足够的知识来浏览我实际上想要更改的代码。有什么合适的地方吗? (理想情况下,它可以在下午完成,而无需先购买和阅读龙书...)

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

因此,有人可以将我指向一个教程,在其中可以仅使用python从头构建基本解析器吗?

解决方案

回答

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

如果我们希望使用完整的解决方案进行词法分析/解析,那么ANTLR也可以生成python。

回答

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

回答

我是PLY的快乐用户。它是Lex&Yacc的纯Python实现,具有许多小细节,使其相当Pythonic且易于使用。由于Lex&Yacc是最受欢迎的词法分析工具,并且用于大多数项目,因此PLY具有站在巨人肩膀上的优势。有关Lex&Yacc的在线知识很多,我们可以将其免费应用于PLY。

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

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

回答

pygments是用python编写的源代码语法荧光笔。它具有词法分析器和格式化程序,并且看一下源可能会很有趣。

回答

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

回答

以下是一些入门指南(大致从最简单到最复杂,最小到最强大):

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级别大学课程中。我们完成了许多任务,需要手工进行解析。如果我们想真正了解引擎盖下发生的事情,我建议我们使用相同的方法。

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

希望这足以让我们入门:)