English 中文(简体)
python中的词法分析、标记化和解析资源
原标题:
  • 时间:2008-08-31 16:50:35
  •  标签:

人们能给我指一下关于Python的词法分析、语法分析和标记化的资源吗?

我正在对一个开源项目进行一些黑客攻击(火线),并希望对lexes解析并标记输入的命令。由于这是真正的工作代码,因此相当复杂,有点难以计算。

我以前没有研究过lex/parse/tokenise的代码,所以我想一种方法是完成一两个关于这方面的教程。我希望能学到足够的知识来浏览我真正想要修改的代码。外面有合适的吗?(理想情况下,它可以在一个下午完成,而不必先购买并阅读龙书…)

编辑:(2008年10月7日)以下答案都不符合我的要求。有了它们,我可以从头开始生成解析器,但我想学习如何从头开始编写自己的基本解析器,而不是使用lex和yacc或类似的工具。这样我就可以更好地理解现有的代码了。

那么,有人能给我指一个教程吗?在这个教程中,我可以只用python从头开始构建一个基本的解析器?

问题回答

我是PLY。它是Lex&;Yacc的纯Python实现,有很多小细节,使它非常Python化,易于使用。由于Lex&aamp;Yacc是最流行的词法分析工具,用于大多数项目,PLY具有站在巨人肩膀上的优势。Lex&;Yacc上有很多在线知识,你可以自由地将其应用于PLY。

PLY也有一个很好的文档页面,并提供一些简单的示例以帮助您入门。

有关许多Python解析工具的列表,请参阅这个

这个问题很古老,但也许我的回答会帮助那些想学习基础知识的人。我发现这个资源非常好。这是一个用python编写的简单解释器,不使用任何外部库。因此,这将有助于任何想了解解析、词法分析和标记化内部工作的人:

"A Simple Intepreter from Scratch in Python:" Part 1, Part 2, Part 3, and Part 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编写的源代码语法高亮器。它有lexer和格式化程序,查看源代码可能会很有趣。

以下是一些让你开始的事情(大致从最简单到最复杂,从最少到最强大):

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级大学课程中。我们做了一些手工解析的作业;如果你想真正了解引擎盖下发生了什么,我推荐同样的方法。

这不是我用过的书,但很不错:编译器设计原则

希望这足以让你开始:)

查看标准模块shlex并修改它的一个副本以匹配您在shell中使用的语法,这是一个很好的起点

如果您想要一个完整的词法分析/解析解决方案的所有功能,ANTLR也可以生成python。

弗雷德里克·托马塞蒂(Frederico Tomassetti)对从BNF到二进制解密的所有相关内容都写得很好(但很短):

  • lexical,
  • parser,
  • abstract-syntax tree (AST), and
  • Construct/code-generator.

他甚至提到了新的解析表达式语法(PEG)。

https://tomassetti.me/parsing-in-python/

我建议http://www.canonware.com/Parsing/,因为它是纯python,您不需要学习语法,但它没有被广泛使用,文档也相对较少。重量级选手是ANTLR和PyParsing。ANTLR也可以生成java和C++解析器,以及AST walker,但你必须学习什么是新语言。





相关问题
热门标签