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"

最初のケースで、値を持つトークンが1つだけではなく、200911つのトークンが生成された理由がわかりませんでしたか?0091100911

4

2 に答える 2

4

Python 2では、で始まる整数リテラル0は8進数(基数8)として解釈されます。したがって、8進数の有効な数字ではないSourceLineため、最初の数字は実際には構文的に無効です。9

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

したがって、トークナイザーは、10進リテラルの横にある有効な8進リテラルとしてそれを解析しているようです。Pythonのような言語を解析しようとしている場合は、これを後処理して必要な形式に戻すことができます。

于 2013-02-18T18:13:20.697 に答える
3

その理由は、tokenizeが「00411」を8進数として解釈しているのに対し、「00911」はそうではないためです。したがって、有効な8進数である「00」に続いて有効な10進数である「911」が返されます。

于 2013-02-18T18:13:15.847 に答える