Форма Бэкуса — Наура
Форма Бэкуса — Наура (БНФ, от англ. Backus–Naur form, BNF) — это формальная система записи синтаксических правил, используемая для описания контекстно-свободных формальных языков, в первую очередь языков программирования, протоколов передачи данных и других формальных нотаций. Представляет собой метаязык, который позволяет однозначно задать грамматику языка через набор продукций (правил вывода). БНФ широко применяется в информатике, лингвистике и теории формальных языков для спецификации синтаксиса, а также в документации и разработке компиляторов.
История
Форма Бэкуса — Наура была разработана в конце 1950-х — начале 1960-х годов в контексте создания первого универсального языка программирования высокого уровня — Алгол. Основной вклад в её создание внесли американский учёный Джон Бэкус и датский информатик Петер Наур.
Предпосылки
До появления БНФ описание синтаксиса языков программирования было неформальным, часто приводило к неоднозначностям и затрудняло разработку компиляторов. В 1958 году на конференции в Цюрихе, посвящённой разработке Алгола, Бэкус предложил использовать формальные правила, основанные на идеях американского лингвиста Ноама Хомского (контекстно-свободные грамматики). Бэкус ввёл обозначения для записи правил, которые затем были доработаны Науром.
Развитие
Первая версия БНФ была опубликована в 1960 году в отчёте «Revised Report on the Algorithmic Language ALGOL 60». В этом документе БНФ использовалась для полного описания синтаксиса Алгола. Позднее, в 1963 году, американский учёный Дональд Кнут предложил расширение БНФ для более удобного описания синтаксических конструкций, которое получило название расширенная форма Бэкуса — Наура (РБНФ, от англ. Extended Backus–Naur form, EBNF). РБНФ добавила метасимволы для указания повторений (например, * для нуля или более повторений) и опциональных элементов (например, ? или [ ]), что упростило запись грамматик.
Современное состояние
БНФ и её варианты (РБНФ, ABNF, W3C EBNF) остаются стандартом де-факто для описания синтаксиса языков программирования, протоколов (например, HTTP, SMTP), форматов данных (JSON, XML) и других формальных систем. В 1996 году Международная организация по стандартизации (ISO) приняла стандарт ISO/IEC 14977:1996, определяющий синтаксис РБНФ.
Основные элементы
Форма Бэкуса — Наура состоит из набора правил (продукций), каждое из которых определяет, как одна синтаксическая конструкция (нетерминал) может быть заменена последовательностью других конструкций (терминалов и нетерминалов). Основные элементы:
- Терминалы — конечные символы языка (например, ключевые слова, знаки операций, литералы). В БНФ обычно записываются в кавычках (например,
"if","+") или выделяются жирным шрифтом. - Нетерминалы — синтаксические категории, которые определяются через правила (например,
<выражение>,<оператор>). В БНФ часто заключаются в угловые скобки:< >. - Метасимволы — символы, используемые для записи правил. В классической БНФ используются:
::=— означает «определяется как» (разделяет левую и правую части правила).|— означает «или» (альтернатива).< >— обозначение нетерминала." "— обозначение терминала (иногда опускаются).- Правило (продукция) — запись вида:
<нетерминал> ::= <последовательность символов>.
Пример записи
Простая грамматика для описания целых чисел:
`` <цифра> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" <целое> ::= <цифра> | <целое> <цифра> ``
Здесь <цифра> определяется как одна из десяти цифр, а <целое> — как одна цифра или целое, за которым следует цифра (рекурсивное определение).
Расширения и варианты
Расширенная форма Бэкуса — Наура (РБНФ, EBNF)
РБНФ добавляет метасимволы для сокращения записи:
{ }— повторение (ноль или более раз).[ ]— опциональный элемент (ноль или один раз).( )— группировка.*— повторение (в некоторых вариантах).+— одно или более повторений.
Пример записи целых чисел в РБНФ:
`` <цифра> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" <целое> ::= <цифра> { <цифра> } ``
Другие варианты
- ABNF (Augmented BNF) — расширенная версия, используемая в спецификациях интернет-протоколов (RFC 5234). Добавляет правила для бинарных данных и числовых значений.
- W3C EBNF — вариант, используемый Консорциумом Всемирной паутины (W3C) для описания синтаксиса XML, HTML и других стандартов.
- Стандарт ISO/IEC 14977 — международный стандарт для РБНФ, определяющий точный синтаксис и семантику.
Применение
Форма Бэкуса — Наура находит применение в следующих областях:
Языки программирования
БНФ используется для формального описания синтаксиса большинства языков программирования: от ранних (Алгол, Паскаль) до современных (Python, Java, C++, Rust). Спецификации языков, такие как стандарты C (ANSI C) или Java (Java Language Specification), содержат грамматики в БНФ или её вариантах. Это позволяет разработчикам компиляторов и интерпретаторов однозначно понимать структуру языка.
Протоколы передачи данных
Многие интернет-протоколы, включая HTTP, SMTP, FTP, описаны с использованием БНФ или ABNF. Например, в RFC 7230 (HTTP/1.1) синтаксис запросов и ответов задан в ABNF.
Форматы данных
Синтаксис таких форматов, как JSON, XML, YAML, часто описывается с помощью БНФ. Например, спецификация JSON (RFC 8259) использует ABNF для определения допустимых структур.
Лингвистика и компьютерная лингвистика
В теоретической лингвистике БНФ применяется для описания синтаксиса естественных языков, хотя для полного описания требуются более мощные грамматики (например, контекстно-зависимые). В компьютерной лингвистике БНФ используется в системах автоматической обработки текста и генерации предложений.
Документация и обучение
БНФ широко применяется в учебной литературе по программированию и теории формальных языков для наглядного объяснения синтаксических конструкций. Многие учебники по компиляторам начинаются с введения в БНФ.
Преимущества и недостатки
Преимущества
- Однозначность: БНФ позволяет точно определить, какие последовательности символов являются допустимыми в языке.
- Простота: Базовый синтаксис БНФ легко изучается и понимается.
- Модульность: Правила можно комбинировать и переиспользовать.
- Автоматизация: На основе БНФ можно автоматически генерировать синтаксические анализаторы (парсеры) с помощью инструментов, таких как Yacc, Bison, ANTLR.
Недостатки
- Ограниченная выразительность: БНФ описывает только контекстно-свободные грамматики. Для языков, требующих контекстной зависимости (например, объявление переменных до их использования), необходимы дополнительные механизмы (семантические правила).
- Громоздкость: Для больших языков грамматика в БНФ может быть очень объёмной, что затрудняет её чтение.
- Отсутствие семантики: БНФ описывает только синтаксис, но не значение конструкций.
Критика и альтернативы
Основная критика БНФ связана с её ограниченностью при описании реальных языков программирования, которые часто содержат контекстно-зависимые элементы (например, правила области видимости, типизацию). Для преодоления этого недостатка используются атрибутные грамматики (например, грамматики ван Вейнгаардена) или семантические действия, добавляемые к правилам БНФ.
Альтернативными подходами к описанию синтаксиса являются:
- Синтаксические диаграммы (railroad diagrams) — графическое представление, более наглядное для человека, но менее формальное.
- Грамматики ван Вейнгаардена — двухуровневые грамматики, способные описывать контекстно-зависимые языки (использовались в языке Алгол 68).
- PEG (Parsing Expression Grammars) — альтернативная формальная система, основанная на синтаксическом анализе с возвратами, более простая для реализации, но менее мощная в некоторых аспектах.
Интересные факты
- Название «форма Бэкуса — Наура» возникло после того, как Петер Наур внёс значительные изменения в первоначальную нотацию Бэкуса, добавив угловые скобки для нетерминалов и символ
::=вместо стрелки. - В 2005 году Джон Бэкус получил премию Тьюринга за вклад в разработку Алгола и создание БНФ.
- БНФ иногда называют «метаязыком», так как она используется для описания других языков.
- Стандарт ISO/IEC 14977 определяет РБНФ, но на практике используется множество неформальных вариантов.
Источники
- Revised Report on the Algorithmic Language ALGOL 60 (1960)
- ISO/IEC 14977:1996 — Information technology — Syntactic metalanguage — Extended BNF
- RFC 5234 — Augmented BNF for Syntax Specifications: ABNF
- Aho, A. V., Lam, M. S., Sethi, R., Ullman, J. D. — Compilers: Principles, Techniques, and Tools (2nd edition)
- Knuth, D. E. — The Art of Computer Programming, Volume 1: Fundamental Algorithms
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →