提问人:Hamish Downer 提问时间:9/1/2008 最后编辑:Hamish Downer 更新时间:5/22/2020 访问量:42975
python 中用于词法分析、标记化和解析的资源
Resources for lexing, tokenising and parsing in python
问:
人们可以向我指出有关使用 Python 进行词法分析、解析和标记化的资源吗?
我正在对一个开源项目(hotwire)进行一些黑客攻击,并想对代码进行一些更改,以对输入到其中的命令进行词法化、解析和标记化。由于它是真正的工作代码,因此它相当复杂且有点难以处理。
我以前没有研究过 lex/parse/tokenize 的代码,所以我认为一种方法是在这方面完成一两个教程。我希望学到足够的知识来浏览我真正想要更改的代码。有什么合适的吗?(理想情况下,它可以在一个下午完成,而不必先购买和阅读龙书......
编辑:(2008年10月7日)以下答案都不能完全满足我的需求。有了它们,我可以从头开始生成解析器,但我想学习如何从头开始编写我自己的基本解析器,而不是使用 lex 和 yacc 或类似的工具。完成此操作后,我就可以更好地理解现有代码。
那么有人可以给我指出一个教程,我可以从头开始构建一个基本的解析器,只使用 python 吗?
答:
看看标准模块 shlex 并修改它的一个副本以匹配您用于 shell 的语法,这是一个很好的起点
如果您想要一个完整的词法/解析解决方案的所有功能,ANTLR 也可以生成 python。
评论
我建议 http://www.canonware.com/Parsing/,因为它是纯 python,你不需要学习语法,但它没有被广泛使用,而且文档相对较少。重量级的是 ANTLR 和 PyParsing。ANTLR 也可以生成 java 和 C++ 解析器,以及 AST walker,但您必须学习相当于新语言的内容。
评论
我是PLY的快乐用户。它是 Lex & Yacc 的纯 Python 实现,有很多小细节,使它非常 Pythonic 且易于使用。由于 Lex 和 Yacc 是最流行的词法和解析工具,并且用于大多数项目,因此 PLY 具有站在巨人肩膀上的优势。Lex & Yacc 网上有很多知识,你可以自由地将其应用到 PLY 上。
PLY也有一个很好的文档页面,其中包含一些简单的示例,可帮助您入门。
有关许多 Python 解析工具的列表,请参阅此处。
评论
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 样式的注释。
评论
以下是一些可以帮助您入门的内容(大致从最简单到最复杂,从最不强大到最强大):
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 级大学课程中。我们做了许多手动解析的任务;如果你想真正了解引擎盖下发生的事情,我建议你采用同样的方法。
这不是我用过的书,但它相当不错:编译器设计原理。
希望这足以让你开始:)
评论
这个问题已经很老了,但也许我的回答会帮助那些想要学习基础知识的人。我发现这个资源非常好。它是用 python 编写的简单解释器,无需使用任何外部库。因此,这将帮助任何想要了解解析、词法和标记的内部工作的人:
“Python 中从头开始的简单 Intepreter:”第 1 部分、第 2 部分、第 3 部分和第 4 部分。
评论
弗雷德里科·托马塞蒂(Frederico Tomassetti)对从BNF到二进制破译的所有相关内容进行了很好的(但简短)简明扼要的文章:
- 词汇的
- 解析 器
- 抽象语法树 (AST) 和
- 构造/代码生成器。
他甚至提到了新的解析表达式语法(PEG)。
下一个:解析,我在哪里可以了解它
评论