Как спецификация ECMA Script 5 позволяет успешно анализировать шестнадцатеричные числа больше 0xFF?

В EMCA262 версии 5.1 определение шестнадцатеричного целочисленного литерала: (страница документа 20, страница PDF 32)

HexIntegerLiteral::
0xШестнадцатеричнаяЦифра
0XШестнадцатеричнаяЦифра
HexIntegerLiteral HexDigit

HexDigit:: один из
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

Это не ГИЛЬ, потому что:

  1. Это явно не результат первого производства
  2. Это также не результат второго производства: установленный 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

Это может показаться более понятным, если вы работаете задом наперед.

Другие вопросы по тегам