2013-05-08 55 views
2

我想縮小一些JavaScript的Python'slimit'包。Slimit Python縮小器奇怪的行爲

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]工作正常。

在數組中縮小8個或更多個零填充整數時,Slimit僅返回一個錯誤。

+0

有人剛剛添加了一個答案,然後刪除它!? 答案是前導零表示八進制數,因此08和09是無效數字。 這在Python中是正確的,但是Javascript允許08和09,將它們轉換爲十進制8和9. 也許Slimit包應該處理數字來複制Javascript規則。 – 2013-05-08 16:46:30

回答

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的整數有爭議。

JSON規範明確禁止八進制形式的數字和一些工具將標記爲無效的JSON(嘗試jsonlint)。來自RFC 4627 (2.4. Numbers)

Octal and hex forms are not allowed. Leading zeros are not allowed.

0

雖然我不確定它是否相對。

這可能useful

(約在JavaScript中parseInt函數的問題)如果我們只是簡單地使用

some_number = parseInt(08); 

它返回0(在某些瀏覽器)

似乎JSON是不支持以0開始解碼數字。

+0

這就是爲什麼你應該總是提供一個基數作爲'parseInt'的第二個參數。 – Blaise 2013-07-08 12:22:01