Необязательное уточнение правила последовательности

3.8. Optional Sequence:
[RULE]

   Square brackets enclose an optional element sequence:

         [foo bar]

   is equivalent to

         *1(foo bar).

Вышеуказанный раздел из RFC5234 кажется мне не правильным.

Я думаю, что это потому, что необязательное правило последовательности [foo bar] не только эквивалентно 1*1(foo bar), но также эквивалентно 1*1(bar foo), И приведенный выше пример соответствует значению по умолчанию 0, то есть 0*1(foo bar),

Тем не менее, [] обычно означает что-то еще. Так что с другой стороны я думаю [foo bar] должно означать либо (foo) или же (bar),

Кто-нибудь может прояснить для меня эту путаницу?

1 ответ

Решение

RFC определяет синтаксис и семантику грамматик ABNF, а цитируемый текст определяет семантику необязательного синтаксиса последовательности. Это правильно по определению. Скобки в ABNF образуют группы последовательностей, (foo bar) средства foo сразу же после bar, Синтаксис числа впереди указывает на повторение, где звездочка отделяет минимальное количество вхождений от максимального числа вхождений. Минимальное значение по умолчанию равно нулю. Так

*1(foo bar)

такой же как

0*1(foo bar)

означая последовательность foo сразу же после bar это появляется по крайней мере ноль и самое большее один раз, то есть последовательность является необязательной. Поскольку необязательные части довольно часто встречаются в формальных грамматиках, для них существует специальный сокращенный синтаксис, а именно

[foo bar]

что также означает последовательность foo сразу же после bar это появляется по крайней мере ноль и самое большее один раз. То, что обычно означают синтаксические конструкции, здесь не имеет значения, спецификация не отражает мир, она определяет свои собственные соглашения.

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