人们可以指向我使用Python进行lexing,解析和标记的资源吗?
我的一个开源项目(做一个小的黑客热线),并希望做的是代码的一些变化LEXES,分析和tokenises进入它的命令.由于它是真正的工作代码,它相当复杂,有点难以解决.
我之前没有处理过lex/parse/tokenise的代码,所以我认为一种方法是在这个方面完成一两个教程.我希望学到足够的知识来浏览我真正想要改变的代码.那里有什么合适的吗?(理想情况下,它可以在一个下午完成而无需先购买和阅读龙书......)
编辑:(2008年10月7日)以下所有答案都没有给出我想要的东西.有了它们,我可以从头开始生成解析器,但我想学习如何从头开始编写自己的基本解析器,而不是使用lex和yacc或类似的工具.完成后,我可以更好地理解现有代码.
那么有人可以指向我一个教程,我可以从头开始构建一个基本的解析器,只使用python?
我是PLY的快乐用户.它是Lex&Yacc的纯Python实现,具有许多细小的细节,使其非常Pythonic且易于使用.由于Lex&Yacc是最受欢迎的lexing和解析工具,并且用于大多数项目,PLY具有站在巨人肩膀上的优势.Lex&Yacc在线存在大量知识,您可以自由地将其应用于PLY.
PLY还有一个很好的文档页面,其中包含一些简单的示例,可帮助您入门.
有关许多Python解析工具的列表,请参阅此内容.
这个问题很老了,但也许我的回答可以帮助那些想学习基础知识的人.我发现这个资源非常好.它是一个用python编写的简单解释器,不使用任何外部库.所以这将有助于任何想要了解解析,lexing和tokenising的内部工作的人:
"Python中从头开始的简单解释:" 第1 部分,第2 部分, 第3 部分和第4部分.
对于中等复杂的语法,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样式注释.
pygments是用python编写的源代码语法荧光笔。它具有词法分析器和格式化程序,并且看一下源可能会很有趣。
以下是一些入门指南(大致从最简单到最复杂,最小到最强大):
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级别大学课程。我们做了很多任务,需要手工解析。如果您想真正了解幕后情况,我建议您使用相同的方法。
这不是我所用的书,但相当不错:《编译器设计原理》。
希望这足以让您入门:)