在python中进行lexin,令牌化和解析的资源

问题描述:

人们可以用Python指向我的资源吗?在python中进行lexin,令牌化和解析的资源

我在开源项目(hotwire)上做了一点小小的修改,并且想要对lexes,parses and tokenises这些命令输入的代码进行一些修改。因为它是真正的工作代码,所以它相当复杂并且难以制定。

我之前没有研究过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漫步者则需要了解新语言的含义。

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

PLY也有一个很好的documentation page与一些简单的例子,让你开始。

有关很多Python解析工具的列表,请参阅this

+0

我第二次推荐PLY,很棒。 – mipadi 2008-11-11 01:46:09

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

+3

对于它的价值,我一直在PyParsing遇到麻烦。我尝试过使用它几次,从来没有完全满意的结果(例如,它花了很长时间,很难调试,需要更多的代码,然后我期望等)。我不能说这是由于我的无知还是PyParsing的失败,尽管... – 2010-09-10 17:45:45

这里有让你开始的几件事(大致从最简单到最复杂,最到最强大的):

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级的大学课程。我们在手动解析的过程中完成了一些任务;如果你想真正理解发生了什么,我会推荐相同的方法。

这不是我用过的书,但很不错:Principles of Compiler Design

希望这足够让你开始:)

+5

这是如何帮助某人知道所有的东西,但在python中寻找实现? – Alex 2013-03-25 11:00:45

这个问题是很老,但也许我的回答能帮助别人谁愿意学习的基础知识。我觉得这个资源非常好。这是一个用python编写的简单解释器,不需要使用任何外部库。因此,这将帮助任何人想了解解析,记载和tokenising的内部工作谁:

“一个简单的Intepreter从无到有的Python:” Part 1Part 2Part 3Part 4

+4

非常好的一系列文章,关注目标而不是工具! – Janus 2013-09-24 10:21:48