3

我正在尝试使用 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:LexToken(NUMBER,'0',1,22) 和 LexToken(RBRACKET,']',1,24) 之间的意外标记 (NUMBER, '8')

奇怪的是,缩小字符串 [01,02,03,04,05,06,07] 可以正常工作。

Slimit 仅在缩小数组中 8 个或更多零填充整数时返回错误。

4

2 回答 2

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)

查看词法分析器的来源,我们看到用于识别数字的正则表达式:

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 是否应该支持八进制表示或将它们视为普通的 base-10 整数的问题是有争议的。

JSON 规范明确禁止八进制形式的数字,一些工具会将其标记为无效 JSON(尝试jsonlint)。来自RFC 4627 (2.4. Numbers)

不允许使用八进制和十六进制形式。前导零是不允许的。

于 2013-05-08T17:20:59.457 回答
0

虽然我不确定它是否是相对的。

这可能有用(关于 parseInt in javascript 的问题)

如果我们只是简单地使用

some_number = parseInt(08);

它返回 0。(在某些浏览器中)

似乎json也不支持解码以0开头的数字。

于 2013-05-08T16:54:27.360 回答