2.1 Увеличенная нормальная запись Бекуса-Наура (BNF).

Все механизмы, определенные этим документом, описаны как в обычной, так и в увеличенной нормальной записи Бекуса-Наура (BNF), подобной используемой в RFC 822 [9]. Разработчик должен быть знаком с такой формой записи, чтобы понять данную спецификацию. Увеличенная нормальная запись Бекуса-Наура включает следующие конструкции:

   имя = определение
   name = definition

Имя правила - это просто его название (не включающее символов "<" и ">"), и отделяемое от определения символом равенства "=". Пробел важен только при выравнивании продолжающихся строк, используемых для указания определений правил, которые занимают более одной строки. Некоторые основные правила, такие как SP, LWS, HT, CRLF, DIGIT, ALPHA и т.д, представлены в верхнем регистре. Угловые скобки используются в определении всякий раз, когда их присутствие облегчает использование имен правил.

   "литерал"
   "literal"

Кавычки окружают литеральный текст. Если не установлено иного, этот текст регистро-независим.

   правило1 | правило2
   rule1 | rule2

Элементы, отделяемые полосой ("|") являются вариантами. Например, "да | нет" принимает значение либо да, либо нет.

   (правило1 правило2)
   (rule1 rule2)

Элементы, включенные в круглые скобки обрабатываются как один элемент. Таким образом, "(elem (foo | bar) elem)" допускает последовательности лексем "elem foo elem" и "elem bar elem".

   *правило
   *rule

Символ "*", предшествующий элементу, указывает повторение. Полная форма - "<n>*<m>element" означает минимум <n>, максимум <m> вхождений элемента. Значения по умолчанию - 0 и бесконечность. Таким образом запись "*(element)" допускает любое число повторений (в том числе ноль); запись "1*element" требует по крайней мере одно повторение; а "1*2element" допускает либо один, либо два повторения.

   [правило]
   [rule]

В квадратные скобки заключают опциональные элементы; "[foo bar]" эквивалентно "*1(foo bar)".

   N правило
   N rule

Точное количество повторений: "<n>(element)" эквивалентно "<n>*<n>(element)"; то есть присутствует точно <n> повторов элемента. Таким образом 2DIGIT - номер из 2 цифр, а 3ALPHA - строка из трех алфавитных символов.

   #правило
   #rule

Конструкция "#" предназначена, подобно "*", для определения списка элементов. Полная форма - "<n>#<m>element" означает минимум <n>, максимум <m> вхождений элемента, отделенных одной или несколькими запятыми (","), и, возможно, линейным пробелом (LWS). Это обычно делает форму списков очень простой; правило типа "( *LWS element *( *LWS "," *LWS element)) " можно представить как "1#элемент". Везде, где используется эта конструкция, пустые элементы допускаются, но не считываются при подсчете представленных элементов. То есть конструкция "(element), , (element)" допускается, но считаются в ней только два элемента. Следовательно там, где требуется по крайней мере один элемент, должен присутствовать по крайней мере один не пустой элемент. Значения по умолчанию - 0 и бесконечность. Таким образом запись "#(element)" допускает любое число повторений (в том числе ноль); запись "1#element" требует по крайней мере одного повтора ненулевого элемента; а "1*2element" допускает один или два повтора.

   ; комментарий
   ; comment

Точка с запятой, поставленная справа от текста правила, начинает комментарий, который продолжается до конца строки. Это - простой способ включения полезных пометок параллельно спецификациям.

   подразумевая *LWS
   implied *LWS

Грамматика, описанная этой спецификацией основана на словах. За исключением случаев, в которых отмечено иное, линейный пробел (LWS) может быть включен между любыми двумя смежными словами (лексемой или строкой цитирования), и между смежными лексемами и разделителями (tspecials), не изменяя интерпретацию поля. Между любыми двумя лексемами должен существовать по крайней мере один разделитель (tspecials), так как иначе они интерпретируются как одна лексема.

Hosted by uCoz