Необязательное уточнение правила последовательности
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
это появляется по крайней мере ноль и самое большее один раз. То, что обычно означают синтаксические конструкции, здесь не имеет значения, спецификация не отражает мир, она определяет свои собственные соглашения.