在python语法库中添加新功能

时间:2013-11-09 08:58:18

标签: python parsing compiler-construction

我想在python中添加一个新功能,纯粹是出于实验目的,我想扩展装饰器语法。目前,装饰器可以应用于函数和类。 我还想在循环(例如for循环)上使用装饰器,也使用代码块。

示例1:

    @foo
    for i in range(20):
        # do something
        # and something more

示例2:

    @foo
        # there's a block starting from an indent here.
        # there's some code now
        # do something
        # and something more

现在虽然这是基本的想法,但我的要求是修改装饰器的主体。 例如,我想根据应用于它的装饰器改变循环。我可以使用AST模块。

问题是我不想完全添加新语法及其完整实现。我只想用新语法进行解析,访问解析树和装饰器的主体,对其进行操作并将其插入到程序主体中,删除装饰器,从而将具有新语法的程序更改为python具有的语法现在。

关于我将如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:2)

如果不添加新语法,则无法执行此操作。装饰者本身没有这样的“身体”。装饰器可以应用于函数或类,就是这样。请参阅http://docs.python.org/2/reference/grammar.html顶部附近:

decorated: decorators (classdef | funcdef)

如果你想要别的东西,它不能是装饰者,它必须是你自己的语法,看起来像装饰者。

您可以编写某种预处理器来解析语法并转换为有效的Python。一种可能性是parser module。它具有解析基本Python元素(如套件(即块))的功能。您可以在文档中看到一个简单的示例。 ast模块也提供此功能。但是这些模块没有提供一种独立于类/函数defs解析装饰器的方法;装饰器基本上被认为是类/函数定义的一部分。

即使你设法解析你的特定构造,你也可能需要做大量的技巧来创建AST。问题是你不能只是“访问解析树”和“修改AST”,因为你编写的程序没有普通的Python解析树,因为它不能被解析为有效的Python。因此,您必须尝试通过将自定义代码与普通的Python解析代码拼接在一起来拼接您自己的AST。