人们可以通过Python向我指出lexing,解析和标记化的资源吗?
我正在对一个开源项目(hotwire)进行一些小黑客攻击,并希望对输入其中的命令lexes,parses and tokenises的代码进行一些更改。因为它是真正的工作代码,所以它相当复杂并且有点难以解决。
之前我没有处理过lex / parse / tokenise的代码,所以我认为一种方法是在这个方面完成一两个教程。我希望学到足够的知识来浏览我真正想要改变的代码。那里有什么合适的吗? (理想情况下,它可以在一个下午完成而无需先购买和阅读龙书......)
编辑(2008年10月7日)以下所有答案都没有给出我想要的内容。有了它们,我可以从头开始生成解析器,但我想学习如何从头开始编写自己的基本解析器,而不是使用lex和yacc或类似的工具。完成后,我可以更好地理解现有代码。
那么有人可以指点我的教程,我可以从头开始构建一个基本的解析器,只使用python吗?
答案 0 :(得分:33)
我是PLY的快乐用户。它是Lex&的纯Python实现。 Yacc,有很多细小的细节,使它非常Pythonic,易于使用。自从Lex& Yacc是最受欢迎的lexing&解析工具并用于大多数项目,PLY具有站在巨人肩膀上的优势。 Lex&网上有很多关于网上知识的知识。 Yacc,你可以自由地将它应用于PLY。
PLY也有一个很好的documentation page,有一些简单的例子可以帮助你入门。
有关许多Python解析工具的列表,请参阅this。
答案 1 :(得分:22)
这个问题很老了,但也许我的回答可以帮助那些想学习基础知识的人。我发现这个资源非常好。它是一个用python编写的简单解释器,不使用任何外部库。所以这将有助于任何想要理解解析,lexing和tokenising的内部工作的人:
答案 2 :(得分:17)
对于中等复杂的语法,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 :(得分:5)
pygments是用python编写的源代码语法高亮显示器。它有词法分析器和格式化程序,可能很有趣,可以查看源代码。
答案 4 :(得分:4)
答案 5 :(得分:4)
这里有一些让你入门的事情(大致从最简单到最复杂,最不强大到最强大):
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。
希望这足以让你开始:)
答案 6 :(得分:3)
我建议http://www.canonware.com/Parsing/,因为它是纯Python,你不需要学习语法,但它没有被广泛使用,并且文档相对较少。重量级是ANTLR和PyParsing。 ANTLR也可以生成java和C ++解析器,以及AST助手,但是你必须学习什么是新语言。
答案 7 :(得分:1)
Frederico Tomassetti对从BNF到二进制破译的所有相关事物都写得很好(但很简短):
他甚至提到了新的解析表达语法(PEG)。