我正在尝试使用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/

10-11 14:41