牛骨文教育服务平台(让学习变的简单)

4.11 @TOKEN装饰器

在一些应用中,你可能需要定义一系列辅助的记号来构建复杂的正则表达式,例如:

digit            = r"([0-9])"
nondigit         = r"([_A-Za-z])"
identifier       = r"(" + nondigit + r"(" + digit + r"|" + nondigit + r")*)"        

def t_ID(t):
    # want docstring to be identifier above. ?????
    ...

在这个例子中,我们希望ID的规则引用上面的已有的变量。然而,使用文档字符串无法做到,为了解决这个问题,你可以使用@TOKEN装饰器:

from ply.lex import TOKEN

@TOKEN(identifier)
def t_ID(t):
    ...

装饰器可以将identifier关联到t_ID()的文档字符串上以使lex.py正常工作,一种等价的做法是直接给文档字符串赋值:

def t_ID(t):
    ...

t_ID.__doc__ = identifier

注意:@TOKEN装饰器需要Python-2.4以上的版本。如果你在意老版本Python的兼容性问题,使用上面的等价办法。