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

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

Resources for lexing, tokenising and parsing in python

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

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

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

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

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


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

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

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


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

" Python中的Scratch的简单解释器:"第1部分,第2部分
第3部分和第4部分。


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

1
2
3
4
5
>>> 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级别大学课程。我们做了很多任务,需要手工解析。如果您想真正了解幕后情况,我建议您使用相同的方法。

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

希望这足以让您入门:)


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


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

如果您想要完整的词法分析功能,ANTLR也可以生成python。


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

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

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

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


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


推荐阅读