
- •Бэкуса-Наура формы (бнф)
- •Расширенные Бэкуса-Наура формы (рбнф)
- •Применение
- •Описание
- •Примеры конструкций
- •Описание Терминалы и нетерминалы
- •Правила
- •Выражения
- •Варианты синтаксиса
- •Примеры конструкций Формальное самоопределение рбнф
- •Число и идентификатор в рбнф
- •Рбнф и другие способы описания формальных грамматик рбнф и бнф
- •Рбнф и синтаксические диаграммы
- •Применение, достоинства и недостатки рбнф
- •Синтаксические диаграммы
Варианты синтаксиса
В некоторых работах встречаются модифицированные варианты синтаксиса РБНФ.
Можно встретить использование в правилах символа «::=» вместо «=» (по аналогии с БНФ).
Иногда конкатенация в выражениях обозначается не простым следованием символов друг за другом, а с помощью запятой. В таком случае несколько слов, написанных через пробелы, следует понимать как одно многословное имя нетерминального символа. Например:
Условный оператор = "IF", Логическое выражение, "THEN",
Группа операторов,
{"ELSIF", Логическое выражение, "THEN", Группа операторов},
["ELSE", Группа операторов],
"ENDIF"
— правило, задающее грамматику условного оператора языка Modula-2, где «Условный оператор» и «Группа операторов» — нетерминальные символы с составными именами.
Стандарт BSI. Принятый в 1981 году Британским институтом стандартов (BSI) стандарт на EBNF отличается от варианта, предложенного Виртом, следующими особенностями:
конкатенация обозначается запятой;
конец определения правила обозначается точкой с запятой;
пробелы в правиле, за исключением заключённых в кавычки, считаются незначимыми.
Примеры конструкций Формальное самоопределение рбнф
Общую форму грамматики РБНФ-описания можно описать в виде РБНФ следующим образом:
Синтаксис = { СинтОператор }.
СинтОператор = идентификатор "=" СинтВыражение ".".
СинтВыражение = СинТерм {"|" СинТерм}.
СинТерм = СинтФактор { СинтФактор }.
СинтФактор = идентификатор | цепочка
| "(" СинтВыражение ")" | "[" СинтВыражение "]"
| "{" СинтВыражение "}".
В данном описании предполагается, что идентификатор и цепочка — предопределённые термы. При желании нетрудно записать и их определение в РБНФ, для этого потребуется лишь задать определённый алфавит и, если это необходимо, дополнительные ограничения на вид идентификатора.
Число и идентификатор в рбнф
Следующие грамматики определяют запись десятичного числа общего вида (с ведущим знаком, возможной дробной частью и порядком) и типичного идентификатора языка программирования (последовательность букв, цифр и знаков подчёркивания, начинающаяся с буквы).
Число = ["+"|"-"]НатЧисло["."[НатЧисло]][("e"|"E")["+"|"-"]НатЧисло].
НатЧисло = Цифра{Цифра}.
Цифра = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9".
Идент = Буква{Буква|Цифра|"_"}.
Определение нетерминала Буква здесь не приведено ввиду очевидности и громоздкости — он представляет собой выбор из принятого алфавита.
Рбнф и другие способы описания формальных грамматик рбнф и бнф
Сходства и различия между БНФ и РБНФ очевидны из описания. Отличие состоит, по большому счёту, в двух основных моментах:
В РБНФ упрощён синтаксис записи правил: знак определения «::=» заменён на «=» и упразднено использование угловых скобок для выделения нетерминалов. В результате исчезла возможность называть нетерминалы многословными идентификаторами, зато запись стала короче. В модификации синтаксиса РБНФ, в которой конкатенация обозначается запятой, многословные идентификаторы использовать можно.
В РБНФ введены два новых синтаксических элемента: условное вхождение (выражение в квадратных скобках) и повторение (выражение в фигурных скобках).
Об удачности или неудачности первого изменения могут быть разные мнения, но, в любом случае, на выразительных возможностях формы оно не сказывается. А вот второе нововведение весьма существенно. Оно также не добавляет принципиально новых выразительных возможностей (всё, что записано в РБНФ, можно адекватно записать и в обычной БНФ), но существенно сокращает и упрощает запись.
Главное преимущество РБНФ перед БНФ — возможность описывать простые повторяющиеся конструкции неопределённой длины (списки, строки, последовательности и так далее) без рекурсивных правил. Отсутствие в БНФ конструкции повторения приводит к тому, что любое повторение приходится определять путём введения дополнительных промежуточных нетерминальных символов и рекурсивных правил, из-за чего определение становится чрезмерно большим по объёму и малопонятным. Описание повторений в РБНФ оказывается одновременно и короче, и удобнее для восприятия человеком.
В качестве примера можно рассмотреть правила, определяющие нетерминал «список», представляющий собой набор от нуля до любого числа идентификаторов, перечисленных через запятую (предполагается, что символы «ПраваяСкобка», «ЛеваяСкобка», «Запятая» и «Идент» уже определены).
Определение в РБНФ включает всего одно правило:
Список = ЛеваяСкобка [Идент {Запятая Идент}] ПраваяСкобка.
Определение в БНФ выглядит так:
<Список> ::= <ЛеваяСкобка> <ПраваяСкобка> | <ЛеваяСкобка> <ИдентСпис> <ПраваяСкобка>
<ИдентСпис> ::= <Идент> | <Идент> <Запятая> <ИдентСпис>
Уже из этого примера видны отличия форм:
В БНФ в правиле, определяющем Список, присутствует два варианта — для пустого списка и для любого другого. В РБНФ за счёт конструкции условного вхождения необходимость в явном описании двух вариантов исчезла.
В БНФ потребовалось ввести искусственное рекурсивное правило ИдентСпис, чтобы описать последовательность идентификаторов, разделённых запятыми. В РБНФ за счёт конструкции повторения данный фрагмент синтаксиса записан прямо в основном правиле, причём в более простом виде.
Поскольку РБНФ-правило одно, его длина меньше и оно не содержит вариантов и рекурсии, его гораздо легче понять. Чтобы восстановить форму списка по приведённым описаниям, в случае РБНФ-описания достаточно последовательно записать значения символов, а для БНФ-описания придётся определить порядок применения правил и построить списки для каждого варианта (а их по два в каждом правиле).
Естественно, что платой за преимущества РБНФ перед БНФ является бо́льшая сложность автоматической интерпретации РБНФ-описаний. Генераторы программ синтаксического разбора по формальным описаниям грамматики, использующие БНФ, проще тех, которые используют РБНФ.