Основные понятия БНФ — терминальные и нетерминальные символы. >=
, <=
и <>.
Чтобы отличать терминальные символы от служебных символов БНФ, мы будем заключать их в одинарные кавычки.
.
Операция ::=
означает определение нетерминального символа. Слева от этого знака ставится нетерминальный символ, смысл которого надо определить, справа — комбинация символов, которой соответствует данный нетерминальный символ. Примером может служить следующее определение:
В данном примере мы определили нетерминальный символ
, который можем использовать в дальнейшем, например, при описании синтаксиса записи вещественного числа. Если мы затем захотим поменять разделитель с точки на запятую, нам достаточно будет переопределить смысл символа
, а не менять определения всех остальных символов, где встречается этот разделитель.
В более сложных случаях нетерминальному символу ставится в соответствие не один символ, а их цепочка, в которую могут входить как терминальные, так и нетерминальные символы. Примером такого определения может служить описание синтаксиса оператора присваивания в Delphi:
При записи синтаксиса в БНФ часто сначала дают определение абстракции самого верхнего уровня, описывающей все выражение в целом, и только потом — определения абстракций нижнего уровня, которые необходимы при ее определении, т. е. порядок определения абстракций может отличаться от принятого в языках программирования определения идентификаторов, согласно которому идентификатор должен быть сначала описан, и лишь затем использован. В частности, в данном примере символы (переменная) и
(выражение) могут быть определены после определения
.
Операция |
в БНФ означает "или" — показывает одну из двух альтернатив. Например, если под нетерминальным символом
может подразумевать знак "+
" или "-
", его определение будет выглядеть следующим образом:
Если альтернатив больше, чем две, они записываются в ряд, разделенные символом |
, например:
Здесь мы определили нетерминальный символ '0'..'9'
.
Операция |
подразумевает, что все, что стоит слева от этого знака, является альтернативой того, что стоит справа (до конца определения или до следующего символа |
). Если в качестве альтернативы выступает только часть определения, то чтобы обособить эту часть, ее заключают в круглые скобки, например:
('to' | 'downto')
Здесь с помощью БНФ описан синтаксис оператора for
языка Delphi. В квадратные скобки заключается необязательная часть определения, как присутствие, так и отсутствие которой допускается синтаксисом, например:
Здесь дано определение условного оператора if
языка Delphi. Квадратные скобки указывают на необязательность части else
.