令牌无效且语法无效

时间:2015-08-05 13:39:27

标签: python python-3.x

我在python的错误案例中有一个问题。我在这里试过....

>>> 0o08
SyntaxError: invalid syntax
>>> 0o8
SyntaxError: invalid token

我想知道:

  • 哪个是无效令牌,0o8
  • 为什么0o08语法无效?

1 个答案:

答案 0 :(得分:7)

0o开头的整数文字被解释为octal。每the documentation

octinteger     ::=  "0" ("o" | "O") octdigit+  # '0o' or '0O' followed by one or more...
... 
octdigit       ::=  "0"..."7"                  # ...digits 0 to 7 inclusive

令牌8不是有效octdigit,因此不允许在八进制文字中,因此"无效令牌"

错误消息不同的原因是(与Python的LL(1)解析器相关,它一次只向前看一个令牌):

  • 如果0o之后的第一个令牌不是octdigit,那么这显然是无效令牌并且解析会立即停止;而
  • 如果后续令牌碰巧无效,则在这么早的阶段就不会检测到这种情况,并且解析会继续进行,直到整行作为无效语法被拒绝。

你可以在IDLE的突出显示中看到这种差异(仅突出显示0o与突出显示的整行),如果你尝试其他选择:

>>> 0ok  # first token is invalid
SyntaxError: invalid token
>>> 0o18  # subsequent token is invalid
SyntaxError: invalid syntax
>>> 0o10  # all tokens are valid
8