ply.lex如何从每个标记定义函数中提取正则表达式?

时间:2014-12-19 00:30:33

标签: python

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 替换时,包含感兴趣的正则表达式。

1 个答案:

答案 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__属性进行访问。