2013-02-18 66 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的語言,您可以將其後處理爲您想要的格式。