ply.lex的令牌函数定义只包含在那里浮动的正则表达式,而实际上没有作为返回值或其他任何内容返回,这让我感到非常惊讶。
以下是一个例子:
def t_INITIAL_TOKENNAME(token):
r"[h]+"
return token
我想了解这实际上是如何工作的,所以我开始关注lex.py ......
以下是ply.lex的一些源代码,取自ply3.4的lex.py:
# Build the master regular expressions
for state in stateinfo:
regex_list = []
# Add rules defined by functions first
for fname, f in linfo.funcsym[state]:
line = func_code(f).co_firstlineno
file = func_code(f).co_filename
regex_list.append("(?P<%s>%s)" % (fname,f.__doc__))
if debug:
debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",fname,f.__doc__, state)
# Now add all of the simple rules
for name,r in linfo.strsym[state]:
regex_list.append("(?P<%s>%s)" % (name,r))
if debug:
debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",name,r, state)
regexs[state] = regex_list
以下行究竟发生了什么?这似乎是lex从每个令牌定义中提取正则表达式的关键线,但我不知道它在做什么...
regex_list.append("(?P<%s>%s)" % (fname,f.__doc__))
我看到fprintf格式在这里发生了,但我不知道&#34;(?P&lt;%s&gt;%s)&#34;&#34;当%s被fname和f。 doc 替换时,包含感兴趣的正则表达式。
答案 0 :(得分:0)
在Python中定义函数(或类或模块)时,如果第一个是字符串,它就成为事物的__doc__
属性:
>>> def f(a,b):
... """Adds a and b."""
... return a+b
...
>>> f.__doc__
'Adds a and b.'
ply.lex使用Python的这个功能。您将正则表达式模式(实际上只是一个字符串)定义为函数体中的第一个元素,并且可以作为函数的__doc__
属性进行访问。