2014-12-19 24 views
0

我真的很驚訝的事實是,ply.lex的標記函數定義只包含正則表達式在那裏浮動,而沒有實際返回值作爲返回值或任何東西。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 

下一行究竟發生了什麼?好像那裏是法從每個令牌定義提取的正則表達式的關鍵線,但我不知道它在做什麼......

regex_list.append("(?P<%s>%s)" % (fname,f.__doc__)) 

我有種看到fprintf中的格式會在這裏,但我不當%s被fname和f替換時,不會看到「(?P <%s>%s)」如何包含感興趣的正則表達式。 doc

回答

0

當你定義Python中的函數(或類,或模塊),如果第一件事情是一個字符串,它成爲的東西__doc__屬性:

>>> def f(a,b): 
...  """Adds a and b.""" 
...  return a+b 
... 
>>> f.__doc__ 
'Adds a and b.' 

ply.lex使用的這一特點蟒蛇。您定義了正則表達式模式(它實際上只是一個字符串)作爲函數體中的第一件事,它可以作爲該函數的__doc__屬性來訪問。

+0

很酷。謝謝! – user49404 2014-12-19 02:54:18

相關問題