Slimit python minifier奇怪的行为

时间:2013-05-08 16:25:13

标签: javascript python minify

我正在尝试用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个或更多零填充整数时才返回错误。

2 个答案:

答案 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开头。