我正在尝试使用 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: Unexpected token (NUMBER, '8') at 1:23 between LexToken(NUMBER,'0',1,22) and LexToken(RBRACKET,']',1,24)
奇怪的是缩小字符串 [01,02,03,04,05,06,07] 没问题。
Slimit 仅在缩小数组中的 8 个或更多零填充整数时返回错误。
最佳答案
这取决于 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 进制整数的问题尚待商榷。
JSON 规范明确禁止八进制形式的数字,一些工具会将其标记为无效 JSON(尝试 jsonlint)。来自 RFC 4627 (2.4. Numbers) :
Octal and hex forms are not allowed. Leading zeros are not allowed.
关于javascript - Slimit python 缩小器奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16445575/