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的兼容性问题,使用上面的等价办法。