Расширенная BNF
::= + | -
::= |
Рассмотрим некоторые расширения BNF, упрощающие запись типовых синтаксических ситуаций.
Для записи контекстно-свободной грамматики могут использоваться различные метаязыки. EBNF (Extended BNF) — один из них [52].
EBNF — расширение BNF, ориентированное на облегчение описания списков и необязательных элементов. EBNF не предоставляет дополнительных возможностей, поэтому все, что определяется в EBNF, может быть также определено в BNF.
Для представления списков важны следующие характеристики: нулевая длина, роль разделителя элементов. Разделитель отделяет элементы, если он появляется между ними. Разделитель завершает элементы, если он появляется после каждого элемента. Разделитель «завершения» более универсален.
В EBNF скобки { } представляют нуль или более повторений заключаемой в них строки. Поэтому конструкция {;} представляет нуль или более операторов, завершаемых точкой с запятой.
Правило подстановки EBNF
::= {; }
эквивалентно паре правил подстановки в BNF
174 |
Глава 6. Средства представления синтаксиса языков программирования |
::= | ; Такие расширения BNF являются сокращениями, они могут уменьшить количество правил подстановки и нетерминалов, но они не изменяют то, что может быть определено. Другим общепринятым расширением является использование скобок [ и ] для заключения в них необязательной конструкции. Например, необязательная целая часть в вещественном числе может быть описана так: ::= [] . Эквивалентом этого правила является пара BNF-правил: ::= . | . Характерный состав метасимволов EBNF: ? фигурные скобки { и } обозначают нуль и более повторений; ? квадратные скобки [ и ] обозначают необязательную конструкцию; ? вертикальная черта | обозначает выбор; ? скобки ( и ) обозначают группировку. EBNF имеет больше метасимволов, чем BNF. Кроме того, эти же символы могут также появляться в синтаксисе языка — индекс i в элементе A[i] вовсе не является необязательным — таким образом, требуется осторожность в различении обычных символов и метасимволов. Путаницу можно устранить заключением лексем в одиночные апострофы '('. Пример. Грамматику арифметических выражений в BNF:
можно переписать в EBNF:
ПОЯСНЕНИЯ к примеру грамматики в EBNF 1. Здесь {(+ | -) } представляет последовательность одного или более термов, отделяемых символами + или -. Круглые скобки вокруг + | - гарантируют, что вертикальная черта представляет выбор между + и -. 2. В правой части правила для фактора скобки взяты в апострофы, так как это обычные символы. В качестве дополнительного примера приведем правило EBNF для условного оператора языка Ada, который допускает многократное вложение в then-часть ветвей с условиями, а также имеет необязательную else-часть: |
Синтаксические схемы |
175 |
ПРИМЕЧАНИЕ --------------------------------------------------------------------------------------------------- В фигурные скобки заключается часть, которая может повторяться нуль и более раз. В квадратные скобки заключается необязательная часть. |
Как видим, это синтаксическое правило тоже имеет очень лаконичную форму. |