处理带前导零的令牌

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个回答

4
在Python 2中,以0开头的整数字面量被解释为八进制数字(基数为8)。因此,你的第一个SourceLine实际上在语法上是无效的,因为9不是八进制中的有效数字:
>>> Y123 = 00911 + 98 / 3
  File "<stdin>", line 1
    Y123 = 00911 + 98 / 3
               ^
SyntaxError: invalid token

所以看起来分词器将其解析为有效的八进制字面量和十进制字面量。如果你正试图解析一些类似于Python的语言,那么你可以将其后处理为所需的格式。


3
原因在于tokenize将'00411'解释为八进制数,而'00911'不是八进制数。因此返回了'00'(一个有效的八进制数)和'911'(一个有效的十进制数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接