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) の間の 1:23 の予期しないトークン (NUMBER, '8')

奇妙なことに、文字列 [01,02,03,04,05,06,07] を縮小しても問題なく動作します。

Slimit は、配列内のゼロが埋め込まれた 8 つ以上の整数を縮小する場合にのみエラーを返します。

4

2 に答える 2

1

これは、slimit で使用されるレクサーに依存します。「0」で始まる数値 (「0x」ではない) は、8 進整数として扱われます。したがって、シーケンス「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)

lexerのソースを見ると、数値を識別するために使用される正規表現が表示されます。

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 が 8 進数表現をサポートするべきか、それとも単純な 10 進法整数として扱うべきかという問題は、議論の余地があります。

JSON 仕様では、数値の 8 進数形式が明示的に禁止されており、一部のツールでは無効な JSON としてフラグが立てられます ( jsonlintを試してください)。RFC 4627 (2.4. Numbers)から:

8 進数と 16 進数は使用できません。先行ゼロは使用できません。

于 2013-05-08T17:20:59.457 に答える