2013-02-18 37 views
3

对于令牌化输入表达式我使用tokenize.generate_tokens()处理令牌带前导零

tokens = cStringIO.StringIO(SourceLine).readline 
tokens = tokenize.generate_tokens(tokens) 

现在,当SourceLine = "Y123 = 00911 + 98/3"tokens元组,我得到以下标记值:

"Y123", "=" , "00", "911","+", "98" , "/" , "3" 

然而,当我通过SourceLine = "Y123 = 00411 + 98/3",我越来越:

"Y123", "=" , "00411", "+" ,"98","/","3" 

我不明白为什么在第一种情况下为00911它生成了两个令牌00911而不是只有一个令牌值为00911

回答

2

原因是tokenize将'00411'解释为八进制数,而'00911'不是。所以它返回'00',一个有效的八进制数,然后是'911',一个有效的十进制数。

3

在Python 2中,以0开头的整数文字被解释为八进制数字(基数8)。因此,你的第一个SourceLine实际上是语法上是无效的,因为9不是八进制有效数字:

>>> Y123 = 00911 + 98/3 
    File "<stdin>", line 1 
    Y123 = 00911 + 98/3 
      ^
SyntaxError: invalid token 

如此看来标记生成器被解析为有效的八进制十进制文本旁边。如果您试图解析某种类似Python的语言,您可以将其后处理为您想要的格式。