我正在尝试使用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]')
给出一个错误:
奇怪的是,缩小字符串[01,02,03,04,05,06,07]可以正常工作。
仅当缩小数组中的8个或更多零填充整数时,Slimit才返回错误。
最佳答案
这取决于slimit使用的词法分析器。以“0”(而非“0x”)开头的数字被视为八进制整数。因此,序列“08”最终以2个单独的 token (“0”,“8”)结尾,因此出现“意外 token ”错误。
请注意以下几点:
>>> 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):
关于javascript - Slimit Python Minifier奇怪的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16445575/