Расширенная форма Бэкуса – Наура - Augmented Backus–Naur form
В Информатика, дополненная форма Бэкуса-Наура (ABNF) это метаязык на основе Форма Бэкуса – Наура (BNF), но состоящий из собственного синтаксиса и правил вывода. Движущий принцип ABNF - описать формальная система языка, который будет использоваться как двунаправленный протокол связи. Это определяется Интернет Стандарт 68 ("STD 68", type case sic), который по состоянию на декабрь 2010 г.[Обновить] является RFC 5234, и он часто служит языком определения для IETF протоколы связи.[1][2]
RFC 5234 заменяет RFC 4234 (который заменил RFC 2234 и RFC 733 ).[3] RFC 7405 обновляет его, добавляя синтаксис для указания строковых литералов с учетом регистра.
Обзор
Спецификация ABNF - это набор правил вывода, записанный как
правило = определение; комментарий CR LF
где правило - это без учета регистра нетерминальный, определение состоит из последовательностей символов, определяющих правило, комментария для документации и заканчивающихся символом возврата каретки и перевода строки.
Имена правил нечувствительны к регистру: <rulename>
, <Rulename>
, <RULENAME>
, и <rUlENamE>
все относятся к одному и тому же правилу. Имена правил состоят из буквы, за которой следуют буквы, цифры и дефисы.
Угловые скобки (<
, >
) не требуются для имен правил (как в BNF). Однако их можно использовать для обозначения имени правила, когда они используются в прозе для распознавания имени правила.
Терминальные значения
Терминалы указываются одним или несколькими числовыми символами.
В качестве знака процента можно указать цифровые символы. %
, за которым следует база (б
= двоичный, d
= десятичный, и Икс
= шестнадцатеричный), за которым следует значение или объединение значений (обозначено .
). Например, возврат каретки определяется как % d13
в десятичном или % x0D
в шестнадцатеричном формате. Возврат каретки, за которым следует перевод строки, может быть указан с конкатенацией как % d13.10
.
Буквальный текст указывается с помощью строки, заключенной в кавычки ("
). В этих строках регистр не учитывается, и используется набор символов (US-) ASCII. Следовательно, строка "abc"
будет соответствовать «abc», «Abc», «aBc», «abC», «ABc», «AbC», «aBC» и «ABC». RFC 7405 добавлен синтаксис для строк с учетом регистра: % s "aBc"
будет соответствовать только "aBc". До этого строку с учетом регистра можно было указать только путем перечисления отдельных символов: для соответствия «aBc» определение должно было быть % d97.66.99
. Строку также можно явно указать как нечувствительную к регистру с помощью %я
приставка.
Операторы
Пустое пространство
Пробел используется для разделения элементов определения; чтобы пробел был распознан как разделитель, он должен быть явно включен. Явная ссылка для одиночного символа пробела: ПОБВ
(линейный пробел) и LWSP
для нуля или более пробелов с разрешенными символами новой строки. В LWSP
определение в RFC5234 является спорным[4] потому что для образования разделителя между двумя полями необходим хотя бы один пробельный символ.
Определения выровнены по левому краю. Когда требуется несколько строк (для удобочитаемости), строки продолжения имеют отступ пробелами.
Комментарий
; комментарий
Точка с запятой (;
) начинает комментарий, который продолжается до конца строки.
Конкатенация
Правило1 Правило2
Правило может быть определено путем перечисления последовательности имен правил.
Чтобы соответствовать строке «aba», можно использовать следующие правила:
фу = % x61 ; а
бар = % x62 ; б
бормотать = фу бар фу
Альтернатива
Правило1 / Правило2
Правило может быть определено списком альтернативных правил, разделенных знаком солидус (/
).
Принять правило фу или правило бар, можно построить следующее правило:
фубар = фу / бар
Дополнительные альтернативы
Правило1 = / Правило2
Дополнительные альтернативы могут быть добавлены к правилу с помощью =/
между именем правила и определением.
Правило
набор правил = alt1 / alt2 / alt3 / alt4 / alt5
эквивалентно
набор правил = alt1 / alt2
набор правил =/ alt3
набор правил =/ alt4 / alt5
Диапазон значений
% c ## - ##
Диапазон числовых значений можно указать с помощью дефиса (-
).
Правило
Восьмеричный = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
эквивалентно
Восьмеричный = % x30-37
Группа последовательности
(Правило1 Правило2)
Элементы могут быть помещены в круглые скобки для группировки правил в определении.
Для сопоставления «элем фубар снафу» или «элем тарфу снафу» можно построить следующее правило:
группа = элем (фубар / тарфу) сбой
Для соответствия «элем фубар» или «тарфу снафу» можно построить следующие правила:
группа = элем фубар / тарфу сбой
группа = (элем фубар) / (тарфу сбой)
Вариативное повторение
n * n Правило
Для обозначения повторения элемента форма * элемент
используется. Необязательный <a>
дает минимальное количество элементов для включения (по умолчанию 0). Необязательный <b>
дает максимальное количество элементов для включения (по умолчанию бесконечность).
Использовать *элемент
для нуля или более элементов, * 1элемент
для нуля или одного элемента, 1 * элемент
для одного или нескольких элементов, и 2 * 3элемент
для двух или трех элементов, ср. обычные выражения е *
, е?
, е +
и е {2,3}
.
Конкретное повторение
nRule
Чтобы указать явное количество элементов, форма элемент
используется и эквивалентен * элемент
.
Использовать 2DIGIT
чтобы получить две числовые цифры, и 3DIGIT
чтобы получить три цифры. (ЦИФРА
определяется ниже в разделе "Основные правила ". Также см индекс в примере ниже.)
Необязательная последовательность
[Правило]
Следующие конструкции эквивалентны для обозначения необязательного элемента:
[фубар сбой]
*1(фубар сбой)
0*1(фубар сбой)
Приоритет оператора
Следующие операторы имеют заданный приоритет от самой жесткой привязки до самой слабой привязки:
- Строки, формирование имен
- Комментарий
- Диапазон значений
- Репетиция
- Группировка, необязательно
- Конкатенация
- Альтернатива
Использование альтернативного оператора с конкатенацией может сбивать с толку, и рекомендуется использовать группировку для создания явных групп конкатенации.
Основные правила
Основные правила определены в стандарте ABNF.
Правило | Формальное определение | Смысл |
---|---|---|
АЛЬФА | % x41-5A /% x61-7A | Заглавные и строчные буквы ASCII (A – Z, a – z) |
ЦИФРА | % x30-39 | Десятичные цифры (0–9) |
HEXDIG | ЦИФРА / «A» / «B» / «C» / «D» / «E» / «F» | Шестнадцатеричные цифры (0–9, A – F, a-f) |
DQUOTE | % x22 | Двойная кавычка |
SP | % x20 | Космос |
HTAB | % x09 | Горизонтальная вкладка |
ПОБВ | SP / HTAB | Пробел и горизонтальная табуляция |
LWSP | * (WSP / CRLF WSP) | Линейный пробел (прошедший символ новой строки) |
VCHAR | % x21-7E | Видимые (печатные) символы |
СИМВОЛ | % x01-7F | Любой символ ASCII, кроме NUL |
ОКТЕТ | % x00-FF | 8 бит данных |
CTL | % x00-1F /% x7F | Управление |
CR | % x0D | Возврат каретки |
LF | % x0A | Перевод строки |
CRLF | CR LF | Интернет-стандарт новой строки |
НЕМНОГО | "0" / "1" | Двоичный символ |
пример
Пример почтового адреса, приведенный на странице расширенной формы Бэкуса – Наура (ABNF), может быть указан следующим образом:
почтовый адрес = имя-часть улица застежка-молнияимя-часть = *(личная часть SP) фамилия [SP суффикс] CRLFимя-часть =/ личная часть CRLFличная часть = имя / (начальный ".")имя = *АЛЬФАначальный = АЛЬФАфамилия = *АЛЬФАсуффикс = ("Младший" / "Старший" / 1*("Я" / "V" / "ИКС"))улица = [подходящий SP] номер дома SP название улицы CRLFподходящий = 1*4ЦИФРАномер дома = 1*8(ЦИФРА / АЛЬФА)название улицы = 1*VCHARзастежка-молния = название города "," SP штат 1*2SP индекс CRLFназвание города = 1*(АЛЬФА / SP)штат = 2АЛЬФАиндекс = 5ЦИФРА ["-" 4ЦИФРА]
Ловушки
RFC 5234 добавляет предупреждение вместе с определением LWSP следующим образом:
Использование этого правила линейного пробела разрешает строки, содержащие только пробелы, которые больше не допустимы в заголовках почты и вызывают проблемы взаимодействия в других контекстах. Не используйте при определении заголовков сообщений и используйте с осторожностью в других контекстах.
использованная литература
- ^ «Официальные стандарты интернет-протокола». Редактор RFC. 21 февраля 2010 г. В архиве из оригинала от 9 февраля 2010 г.. Получено 2010-02-21.
- ^ Crocker, D .; Оверелл, П. (январь 2008 г.). «Расширенный BNF для спецификаций синтаксиса: ABNF» (простой текст). Редактор RFC. п. 16. Получено 2010-02-21.
- ^ "Индекс RFC". Редактор RFC. 2010-02-19. В архиве из оригинала от 9 февраля 2010 г.. Получено 2010-02-21.
- ^ RFC Errata 3096.