javascript - Slimit python 缩小器奇怪的行为

标签 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: 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/

相关文章:

javascript - 使用javascript注销Github

Python "with"语句会出现TOCTOU吗?

python - API测试自动化框架结构

asp.net - 如何让 Chirpy 与 JS 和 mash.config 一起工作

javascript - 如何组合(缩小)已编译的 Angular 2 组件?

javascript - 无法从 componentDidMount 调用函数

javascript - 如何使用 Jasmine 测试 Angular Promise

javascript - 根据覆盖率报告删除未使用的 javascript 代码

javascript - 通过 ant 执行 JavaScript (HTML) 文件并将输出重定向到文件

python - 从每个文本文件中删除最后一个空行