擅长:python、mysql、java
<p>这要归功于slimit使用的lexer。以“0”(但不是“0x”)开头的数字被视为八进制整数。因此,序列“08”以2个独立的标记(“0”、“8”)结束,因此出现“意外标记”错误。在</p>
<p>注意以下几点:</p>
<pre><code>>>> from slimit import lexer
>>> L = Lexer()
>>> L.input("02")
>>> L.token()
LexToken(NUMBER,'02',1,0)
>>> L.input("08")
>>> L.token()
LexToken(NUMBER,'0',1,0)
>>> L.token()
LexToken(NUMBER,'8',1,1)
</code></pre>
<p>在查找lexer的<a href="https://github.com/rspivak/slimit/blob/4679aa25f1fcc690473e750fa97b6e5e02a35cc8/src/slimit/lexer.py#L346" rel="nofollow">the source</a>时,我们看到用于标识数字的正则表达式:</p>
^{pr2}$
<p>slimit是应该支持八进制表示还是将它们作为普通的以10为基数的整数,这个问题有待商榷。在</p>
<p>JSON规范明确禁止数字的八进制形式,一些工具会将其标记为无效的JSON(try <a href="http://jsonlint.com/" rel="nofollow">jsonlint</a>)。从<a href="http://www.ietf.org/rfc/rfc4627.txt?number=4627" rel="nofollow">RFC 4627 (2.4. Numbers)</a>:</p>
<blockquote>
<p>Octal and hex forms are not allowed. Leading zeros are not allowed.</p>
</blockquote>