在python中进行lexin,令牌化和解析的资源
人们可以用Python指向我的资源吗?在python中进行lexin,令牌化和解析的资源
我在开源项目(hotwire)上做了一点小小的修改,并且想要对lexes,parses and tokenises这些命令输入的代码进行一些修改。因为它是真正的工作代码,所以它相当复杂并且难以制定。
我之前没有研究过lex/parse/tokenise的代码,所以我想一种方法是在这方面学习一两个教程。我希望能够学习到足以浏览我实际想要改变的代码。有什么合适的吗? (理想情况下,它可以在一个下午完成,而无需先购买并阅读龙书...)
编辑:(2008年10月7日)下面的答案都没有给我想要的东西。有了它们,我可以从头开始生成解析器,但我想学习如何从头开始编写我自己的基本解析器,而不是使用lex和yacc或类似的工具。做完这些之后,我可以更好地理解现有的代码。
那么有人可以指向一个教程,我可以从头开始构建一个基本的解析器,只需使用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。
对于中等复杂的文法,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风格的注释。
对于它的价值,我一直在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。
希望这足够让你开始:)
这是如何帮助某人知道所有的东西,但在python中寻找实现? – Alex 2013-03-25 11:00:45
我第二次推荐PLY,很棒。 – mipadi 2008-11-11 01:46:09