parser访问pthon语法分析树
译者:winterTTr
parser模块提供了一个接口,用来访问python内部语法分析器和字节码(byte-code)编译器。这个接口的主要目的在于允许python编码可以编辑python表达式的语法分析树以及在此基础上创建可运行的代码。这比试图分析和更改任意的python代码段要好得多,因为语法分析在一定程度上和编码是相同的,并且前者更快。
这个模块创建的数据结构,在使用中有一些需要注意的地方。此处并不是一个讲述如何编辑python语法分析代码树,而是利用parser模块的一些例子。
最重要的前提是, 我们需要对python内部语法分析过程有一个很好的了解。有关语法的详细信息,请参考Python Language Reference。分析器本身来自于一个语法规则,这个规则定义在Grammar/Grammar文件中,你在每个标准的python发行版中都应该能找到。通过这个模块(parser)创建的,储存在AST对象中的语法分析树,实际上是来自于内部分析器,可以通过expr() 或者suite() 函数来创建(我们下面将会提到)。利用sequence2ast()创建的AST对象如实的模拟着这些结构。请注意,所谓“正确”的序列值在不同的python版本之间,是不尽相同的,因为python的正式语法是处于不断的修正之中的。但是,以源码的形式在不同的python版本之间转换代码,是可以创建正确的语法分析树的。但是,有一个限制,那就是迁移至老版本的python解析器的时候,可能无法支持一些最新的语言特性。语法分析树在不同python版本之间并不是一致的,虽然源码总是向前兼容的。
每个通过 ast2list() 或者ast2tuple()得到的元素,都具有一个简单的形式。在语法中,代表非终结的元素序列通常长度大于1。第一个元素是一个整数,用来标示语法中的一个production。这些整数在Include/graminit.h和python本身的symbol模块中都有定义,并通过符号名的方式被定义。每一个序列的附加元素代表着一个production部件,而且,常常和父节点有相同的结构。有关这些结构,我们所应该关注的一个重要方面是,关键字是用来标示父节点类型的,例如在if_stmt中,关键字if是被包含在节点树中,而并没有被特殊对待。例如:if关键字通过( 1, 'if' )代表,其中1是代表所有NAME类型的token(包括变量和用户定义的函数名)。另一种行号也要返回的形式(1, 'if', 12),其中12代表终止符号找到的行号。
终止元素也通过相同的方式表示,只是没有子元素或者附加的代码字符串。上面提到的if关键字,是具有代表性的。不同类型的终止元素也在Include/graminit.h和python本身的symbol模块中都有定义。
AST对象并有没要求必须支持这个模块的功能,但是提供AST对象来使用是出于如下三个目的:
- 允许程序分步来进行复杂的语法分析
- 当与python的list或者tuple类型对比的时候,提供了一个语法分析树的表现形式
- 减轻C模块中操作语法树的附加模块的创建过程
可以在python中创建一个简单的wrapper类来隐藏AST对象的使用。
parser模块定义的函数出于一种独特的目的。最重要的目的是创建AST对象和转换AST对象到另一种表现形式,例如:语法树或者编译代码对象,同时,也存在有一些函数是用来查询AST对象代表的语法树的类型的。
介绍Python的parser模块,用于访问Python语法分析树,便于编辑Python表达式的语法结构,创建可运行代码。需理解Python语法分析过程,适用于语法分析树的编辑。
2084

被折叠的 条评论
为什么被折叠?



