stringtranslate.com

Расширенная форма Бэкуса–Наура

В информатике расширенная форма Бэкуса–Наура ( ABNF ) — это метаязык, основанный на форме Бэкуса–Наура (BNF), но состоящий из собственных правил синтаксиса и вывода. Принципиальная схема ABNF — описать формальную систему языка, используемого в качестве двунаправленного протокола связи . Она определена стандартом Интернета 68 («STD 68», type case sic), который по состоянию на декабрь 2010 года был RFC  5234, и часто служит языком определения для протоколов связи IETF . [1] [2]

RFC  5234 заменяет RFC  4234, 2234 и 733. [3] RFC  7405 обновляет его, добавляя синтаксис для указания строковых литералов с учетом регистра.

Обзор

Синтаксическая диаграмма ABNF правил ABNF
Синтаксическая диаграмма ABNF правил ABNF

Спецификация ABNF представляет собой набор правил вывода, записанных как

правило = определение ; комментарий CR LF  

где правило — нечувствительный к регистру нетерминал , определение состоит из последовательности символов, определяющих правило, комментария для документации и заканчивается символом возврата каретки и перевода строки.

Имена правил нечувствительны к регистру: <rulename>, <Rulename>, <RULENAME>, и <rUlENamE>все относятся к одному и тому же правилу. Имена правил состоят из буквы, за которой следуют буквы, цифры и дефисы.

Угловые скобки ( <, >) не требуются вокруг имен правил (как в BNF). Однако они могут использоваться для разграничения имени правила при использовании в прозе для различения имени правила.

Конечные ценности

Терминалы обозначаются одним или несколькими цифровыми символами.

Числовые символы могут быть указаны как знак процента %, за которым следует основание ( b= двоичное, d= десятичное и x= шестнадцатеричное), за которым следует значение или конкатенация значений (обозначается .). Например, возврат каретки указан как %d13в десятичном или %x0Dшестнадцатеричном формате. Возврат каретки, за которым следует перевод строки, может быть указан с конкатенацией как %d13.10.

Буквальный текст указывается с помощью строки, заключенной в кавычки ( "). Эти строки нечувствительны к регистру, а используемый набор символов — (US-)ASCII. Таким образом, строка "abc"будет соответствовать «abc», «Abc», «aBc», «abC», «ABc», «AbC», «aBC» и «ABC». RFC 7405 добавил синтаксис для строк, чувствительных к регистру: %s"aBc"будет соответствовать только «aBc». До этого чувствительную к регистру строку можно было указать только путем перечисления отдельных символов: для соответствия «aBc» определение было бы %d97.66.99. Строку также можно явно указать как нечувствительную к регистру с помощью %iпрефикса.

Операторы

Пустое пространство

Пробел используется для разделения элементов определения; чтобы пробел был распознан как разделитель, он должен быть явно включен. Явная ссылка на одиночный символ пробела — WSP(линейный пробел), и LWSPдля нуля или более символов пробела с разрешенными переводами строк. Определение LWSPв RFC5234 является спорным [4], поскольку для формирования разделителя между двумя полями необходим по крайней мере один символ пробела.

Определения выравниваются по левому краю. Если требуется несколько строк (для удобства чтения), строки продолжения отступают пробелами.

Комментарий

; comment

Точка с запятой ( ;) начинает комментарий, который продолжается до конца строки.

Конкатенация

Rule1 Rule2

Правило можно определить, перечислив последовательность имен правил.

Для сопоставления строки «aba» можно использовать следующие правила:

Альтернатива

Rule1 / Rule2

Правило может быть определено списком альтернативных правил, разделенных косой чертой ( ) /.

Чтобы принять правило fu или правило bar , можно построить следующее правило:

Дополнительные альтернативы

Rule1 =/ Rule2

Дополнительные альтернативы могут быть добавлены к правилу путем использования =/между именем правила и определением.

Правило

поэтому эквивалентно

Диапазон значений

%c##-##

Диапазон числовых значений может быть указан с помощью дефиса ( -).

Правило

эквивалентно

Группа последовательности

(Rule1 Rule2)

Элементы могут быть заключены в скобки для группировки правил в определении.

Для сопоставления «ab d» или «ac d» можно построить следующее правило:

Для сопоставления «ab» или «cd» можно построить следующие правила:

Переменное повторение

n*nRule

Для указания повторения элемента <a>*<b>elementиспользуется форма. Необязательный параметр <a>указывает минимальное количество включаемых элементов (по умолчанию 0). Необязательный параметр <b>указывает максимальное количество включаемых элементов (по умолчанию бесконечность).

Используйте *elementдля нуля или более элементов, *1elementдля нуля или одного элемента, 1*elementдля одного или более элементов и 2*3elementдля двух или трех элементов, см. регулярные выражения e* , e?, e+и e{2,3}.

Конкретное повторение

nRule

Для указания явного количества элементов <a>elementиспользуется форма , эквивалентная <a>*<a>element.

Используйте 2DIGITдля получения двухзначного числа и 3DIGITдля получения трехзначного числа. ( DIGITопределено ниже в разделе «Основные правила». Также см. почтовый индекс в примере ниже.)

Необязательная последовательность

[Rule]

Для указания необязательного элемента следующие конструкции эквивалентны:

Приоритет оператора

Следующие операторы имеют заданный приоритет от наиболее тесной связи к наиболее свободной:

  1. Строки, формирование имен
  2. Комментарий
  3. Диапазон значений
  4. Повторение
  5. Группировка, необязательно
  6. Конкатенация
  7. Альтернатива

Использование альтернативного оператора с конкатенацией может привести к путанице, поэтому рекомендуется использовать группировку для создания явных групп конкатенации.

Основные правила

Синтаксическая диаграмма ABNF основных правил
Синтаксическая диаграмма ABNF основных правил

Основные правила определены в стандарте ABNF.

Обратите внимание, что в диаграмме основных правил набор символов CHAR2 встроен в char-val , а CHAR3 встроен в prose-val в спецификации RFC. Они названы здесь для ясности в основной диаграмме синтаксиса.

Пример

Пример почтового адреса (США), приведенный на странице расширенной формы Бэкуса–Наура (ABNF), может быть указан следующим образом:

почтовый-адрес = часть имени часть улицы почтовый индекс    часть-имени = * ( личная-часть SP ) фамилия [ суффикс SP ] CRLF часть-имени =/ личная-часть CRLF          личная-часть = имя / ( инициал "." ) имя = * ALPHA инициал = ALPHA фамилия = * ALPHA суффикс = ( "мл." / "ст." / 1* ( "I" / "V" / "X" ))                     улица = [ кв SP ] номер-дома SP название-улицы CRLF кв = 1*4 ЦИФРА номер-дома = 1*8 ( ЦИФРА / АЛЬФА ) название-улицы = 1* VCHAR               zip-часть = название города "," SP штат 1*2 SP почтовый индекс CRLF название города = 1* ( ALPHA / SP ) штат = 2 ALPHA почтовый индекс = 5 ЦИФР [ "-" 4 ЦИФРЫ ]                  

Подводные камни

RFC 5234 добавляет предупреждение в связи с определением LWSP следующим образом:

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

Ссылки

  1. ^ "Официальные стандарты интернет-протокола". Редактор RFC. 2010-02-21. Архивировано из оригинала 9 февраля 2010 года . Получено 2010-02-21 .
  2. ^ Крокер, Д.; Оверелл, П. (январь 2008 г.). "Расширенная BNF для спецификаций синтаксиса: ABNF" (открытый текст) . Редактор RFC. стр. 16. Получено 21.02.2010 .
  3. ^ "RFC Index". Редактор RFC. 2010-02-19. Архивировано из оригинала 9 февраля 2010 года . Получено 2010-02-21 .
  4. ^ RFC Errata 3096.