2013-05-08 6 views
2

Я пытаюсь минимизировать некоторые javascript с помощью пакета slimit Python.Slimit python minifier странное поведение

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 или более нулевых заполненных целых чисел в массиве.

+0

Кто-то только что добавил ответ, а затем удалил его !? Ответ заключался в том, что начальный ноль указывает восьмеричное число, поэтому 08 и 09 являются недопустимыми числами. Это верно в Python, однако Javascript разрешает 08 и 09, преобразовывая их в десятичные числа 8 и 9. Возможно, пакет Slimit должен обрабатывать числа для репликации правила Javascript. –

ответ

1

Это относится к lexer, используемому 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.

0

Хотя я не уверен, что это относительный или нет.

Это может useful (задача о ParseInt в JavaScript)

Если мы просто использовать

some_number = parseInt(08); 

Это вернет 0. (в каком-то браузере)

Кажется JSON не поддержка декодируйте число, начинающееся с 0.

+0

Вот почему вы всегда должны предоставлять radix в качестве второго параметра 'parseInt'. – Blaise

Смежные вопросы