RFC: 2068
Оригинал: Hypertext Transfer Protocol - HTTP/1.1
Другие версии: RFC 2616
Категория: Предложенный стандарт
Дата публикации:
Авторы: , , , ,
Перевод: Алексей Симонов

2. Письменные соглашения и обобщенная грамматика

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), так как иначе они
   интерпретируются как одна лексема.
2007 - 2017 © Русские переводы RFC, IETF, ISOC.