Как спецификация ECMA Script 5 позволяет успешно анализировать шестнадцатеричные числа больше 0xFF?
В EMCA262 версии 5.1 определение шестнадцатеричного целочисленного литерала: (страница документа 20, страница PDF 32)
HexIntegerLiteral::
0x
ШестнадцатеричнаяЦифра0X
ШестнадцатеричнаяЦифра
HexIntegerLiteral HexDigitHexDigit:: один из
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
Как я понимаю, HIL может выглядеть так:
(ХИЛ (HIL (HIL (HIL (HIL (HIL HD)))))))
HIL может выглядеть как 0x0
(то есть 0x
и шестнадцатеричная цифра) и HD может быть 0
Таким образом, HIL может быть 0x00x00x00x00x00
Очевидно, что ни одна из реализаций не работает таким образом, поэтому я явно что-то неправильно понимаю. Как я должен интерпретировать (по моему мнению) это рекурсивное определение?
2 ответа
Определение может быть рекурсивным, но оно не работает так. По сути, это говорит о том, что HexIntegerLiteral является одним из:
- регистронезависимый префикс
0x
сопровождаемый одной шестнадцатеричной цифрой, или - HexIntegerLiteral, за которым следует одна шестнадцатеричная цифра
0x00x00
не следует этому определению. Вот почему:
0x0
Это, очевидно, HIL от первого производства.
0x00
Это также HIL от второго производства: HIL 0x0
(установлено выше) сопровождается шестнадцатеричной цифрой 0
,
0x00x
Это не ГИЛЬ, потому что:
- Это явно не результат первого производства
- Это также не результат второго производства: установленный HIL
0x00
сверху следует что-то, кроме шестнадцатеричной цифры.
Другими словами, приведенная выше грамматика не позволяет этого:
(HIL (HIL (HIL (HIL (HIL (HIL HD))))))
Это позволяет это:
(HIL (HD (HD (HD (HD (HD))))))
HexIntegerLiteral определяется как 0X
или же 0X
сопровождаемый одним из 0-F
, лайк...
// vv----`0x`
0x5
// ^---Hex Digit
... или как HexIntegerLiteral
сопровождаемый одним из 0-F
, лайк...
// vvv----HexIntegerLiteral
0x54
// ^---Hex Digit
...или же...
// vvvv----HexIntegerLiteral
0x546
// ^---Hex Digit
Это может показаться более понятным, если вы работаете задом наперед.