我正在尝试用Python“slimit”软件包缩小一些javascript。
import slimit
slimit.minify('[1,2,3,4,5,6,7,8]')
运行良好并返回'[1,2,3,4,5,6,7,8]'
import slimit
slimit.minify('[01,02,03,04,05,06,07,08]')
给出错误:
SyntaxError:在1:23之间的意外标记(NUMBER,'8') LexToken(NUMBER,'0',1,22)和LexToken(RBRACKET,']',1,24)
奇怪的是,缩小字符串[01,02,03,04,05,06,07]可以正常工作。
Slimit仅在缩小数组中8个或更多零填充整数时才返回错误。
答案 0 :(得分:1)
这取决于slimit使用的词法分析器。以“0”开头的数字(但不是“0x”)被视为八进制整数。因此,序列“08”最终成为2个单独的令牌(“0”,“8”),因此出现“意外令牌”错误。
请注意以下事项:
>>> 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)
查看词法分析器的the source,我们看到用于识别数字的正则表达式:
t_NUMBER = r"""
(?:
0[xX][0-9a-fA-F]+ # hex_integer_literal
| 0[0-7]+ # or octal_integer_literal (spec B.1.1)
| (?: # or decimal_literal
(?:0|[1-9][0-9]*) # decimal_integer_literal
\. # dot
[0-9]* # decimal_digits_opt
(?:[eE][+-]?[0-9]+)? # exponent_part_opt
|
\. # dot
[0-9]+ # decimal_digits
(?:[eE][+-]?[0-9]+)? # exponent_part_opt
|
(?:0|[1-9][0-9]*) # decimal_integer_literal
(?:[eE][+-]?[0-9]+)? # exponent_part_opt
)
)
"""
slimit是否应该支持八进制表示或将它们视为普通的10-end整数的问题值得商榷。
JSON规范明确禁止数字的八进制形式,一些工具会将其标记为无效的JSON(try jsonlint)。来自RFC 4627 (2.4. Numbers):
不允许使用八进制和十六进制形式。不允许使用前导零。
答案 1 :(得分:0)
虽然我不确定它是否相对。
这可能是useful(关于javascript中的parseInt的问题)
如果我们只是简单地使用
some_number = parseInt(08);
它返回0.(在某些浏览器中)
似乎json不支持解码数字以0开头。