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。
很酷。謝謝! – user49404 2014-12-19 02:54:18