Дополненная форма Бэкуса – Наура.
В информатике основанный расширенная форма Бэкуса-Наура ( ABNF ) — это метаязык, на форме Бэкуса-Наура (BNF), но состоящий из собственного синтаксиса и правил вывода. Основным принципом ABNF является описание формальной системы языка, который будет использоваться в качестве протокола двунаправленной связи . Он определен Интернет-стандартом 68 («STD 68», тип Case sic), который по состоянию на декабрь 2010 г. [update] is RFC 5234 , и он часто служит языком определения протоколов связи IETF . [ 1 ] [ 2 ]
RFC 5234 заменяет собой RFC 4234 , 2234 и 733 . [ 3 ] RFC 7405 обновляет его, добавляя синтаксис для указания строковых литералов с учетом регистра.
Обзор
[ редактировать ]Спецификация ABNF представляет собой набор правил вывода, записанных как
rule = definition ; comment 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» можно использовать следующие правила:
fu = %x61 ; a
bar = %x62 ; b
mumble = fu bar fu
Альтернатива
[ редактировать ]Rule1 / Rule2
Правило может быть определено списком альтернативных правил, разделенных косой чертой ( /
).
Чтобы принять правило fu правил или панель , можно создать следующее правило:
fubar = fu / bar
Дополнительные альтернативы
[ редактировать ]Rule1 =/ Rule2
Дополнительные альтернативы могут быть добавлены к правилу с помощью =/
между именем правила и определением.
Правило
ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5
поэтому эквивалентно
ruleset = alt1 / alt2 / alt3 / alt4 / alt5
Диапазон значений
[ редактировать ]%c##-##
Диапазон числовых значений можно указать с помощью дефиса ( -
).
Правило
OCTAL = %x30-37
эквивалентно
OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
Группа последовательности
[ редактировать ](Rule1 Rule2)
Элементы можно помещать в круглые скобки для группировки правил в определении.
Для соответствия «ab d» или «ac d» можно построить следующее правило:
group = a (b / c) d
Для соответствия «ab» или «cd» можно построить следующие правила:
group = a b / c d
group = (a b) / (c d)
Переменное повторение
[ редактировать ]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]
Для обозначения необязательного элемента эквивалентны следующие конструкции:
[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)
Приоритет оператора
[ редактировать ]Следующие операторы имеют заданный приоритет от самой жесткой привязки к самой слабой привязке:
- Строки, формирование имен
- Комментарий
- Диапазон значений
- Повторение
- Группировка, необязательно
- Конкатенация
- Альтернатива
Использование альтернативного оператора с конкатенацией может сбить с толку, поэтому рекомендуется использовать группировку для создания явных групп конкатенации.
Основные правила
[ редактировать ]Основные правила определены в стандарте ABNF.
Правило | Формальное определение | Значение |
---|---|---|
АЛЬФА | %x41–5A / %x61–7A | Прописные и строчные буквы ASCII (A–Z, a–z) |
ЦИФРА | %x30–39 | Десятичные цифры (0–9) |
ВЕДЬМА РЫБАТЬ | ЦИФРА / «А» / «Б» / «С» / «D» / «Е» / «F» | Шестнадцатеричные цифры (0–9, A–F, af) |
ЦИТАТА | %x22 | Двойная кавычка |
СП | %x20 | Космос |
ХТАБ | %x09 | Горизонтальная вкладка |
ПОВП | СП/ХТАБ | Пространство и горизонтальная вкладка |
ЛВСП | *(WSP/CRLF WSP) | Линейный пробел (после новой строки) |
VCHAR | %x21–7E | Видимые (печатные) символы |
ЧАР | %x01–7F | Любой символ ASCII, кроме NUL. |
ОКТЕТ | %x00–FF | 8 бит данных |
CTL | %x00–1F / %x7F | Элементы управления |
ЧР | %x0D | Возврат каретки |
НЧ | %x0A | перевод строки |
CRLF | ЧР ЛФ | Интернет-стандартная новая строка |
КУСОЧЕК | «0» / «1» | Двоичная цифра |
Обратите внимание, что на диаграмме основных правил кодировка CHAR2 встроена в char-val , а CHAR3 встроена в prose-val в спецификации RFC. Они названы здесь для ясности на основной синтаксической диаграмме.
Пример
[ редактировать ]Пример почтового адреса (США), приведенный на странице расширенной формы Бэкуса – Наура (ABNF), может быть указан следующим образом:
postal-address = name-part street zip-part
name-part = *(personal-part SP) last-name [SP suffix] CRLF
name-part =/ personal-part CRLF
personal-part = first-name / (initial ".")
first-name = *ALPHA
initial = ALPHA
last-name = *ALPHA
suffix = ("Jr." / "Sr." / 1*("I" / "V" / "X"))
street = [apt SP] house-num SP street-name CRLF
apt = 1*4DIGIT
house-num = 1*8(DIGIT / ALPHA)
street-name = 1*VCHAR
zip-part = town-name "," SP state 1*2SP zip-code CRLF
town-name = 1*(ALPHA / SP)
state = 2ALPHA
zip-code = 5DIGIT ["-" 4DIGIT]
Подводные камни
[ редактировать ]RFC 5234 добавляет предупреждение к определению LWSP следующим образом:
Использование этого правила линейных пробелов разрешает строки, содержащие только пробелы, которые больше недопустимы в заголовках сообщений и вызывают проблемы совместимости в других контекстах. Не используйте при определении заголовков сообщений и используйте с осторожностью в других контекстах.
Ссылки
[ редактировать ]- ^ «Официальные стандарты интернет-протокола» . Редактор RFC. 21 февраля 2010 г. Архивировано из оригинала 9 февраля 2010 года . Проверено 21 февраля 2010 г.
- ^ Крокер, Д.; Оверелл, П. (январь 2008 г.). «Расширенный BNF для спецификаций синтаксиса: ABNF» (обычный текст) . Редактор RFC. п. 16 . Проверено 21 февраля 2010 г.
- ^ «Индекс РФЦ» . Редактор RFC. 19 февраля 2010 г. Архивировано из оригинала 9 февраля 2010 года . Проверено 21 февраля 2010 г.
- ^ Ошибки RFC 3096 .