【问题标题】:Adding a new feature in the python syntax base在 python 语法库中添加新功能
【发布时间】:2013-11-09 08:58:18
【问题描述】:

我想在 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 的语法现在。

知道我将如何去做吗?

【问题讨论】:

  • 你能缩小你的问题范围吗?这也太国外了吧。

标签: python parsing compiler-construction


【解决方案1】:

如果不添加新语法,您将无法做到这一点。装饰者本身并没有这样的“身体”。装饰器可以应用于函数或类,仅此而已。见http://docs.python.org/2/reference/grammar.html顶部附近:

decorated: decorators (classdef | funcdef)

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2011-10-20
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多