stringtranslate.com

Дополненная форма Бэкуса – Наура.

В информатике расширенная форма Бэкуса-Наура ( ABNF ) — это метаязык, основанный на форме Бэкуса-Наура (BNF), но состоящий из собственного синтаксиса и правил вывода. Основным принципом ABNF является описание формальной системы языка, который будет использоваться в качестве протокола двунаправленной связи . Он определен Интернет-стандартом 68 («STD 68», тип регистра так в оригинале), который по состоянию на декабрь 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 или панель правил , можно создать следующее правило:

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

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          личная часть = имя / ( начальная "." ) имя = * АЛЬФА начальная = АЛЬФА фамилия = * АЛЬФА- суффикс = ( "Младший" / "Старший" / 1* ( "Я" / " В" / "Х" ) ))                     улица = [ apt SP ] номер дома SP название улицы CRLF apt = 1*4 ЦИФРА номер дома = 1*8 ( ЦИФРА / АЛЬФА ) название улицы = 1* VCHAR               zip-part = название города "," Штат SP 1*2 Почтовый индекс SP CRLF Название города = 1* ( ALPHA / SP ) State = 2 Почтовый индекс ALPHA = 5 ЦИФР [ "-" 4 ЦИФРЫ ]                  

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

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

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

Рекомендации

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