Читаем О чём не пишут в книгах по Delphi полностью

Основные понятия БНФ — терминальные и нетерминальные символы. Терминальные символы — это отдельные символы или их последовательности, являющиеся с точки зрения синтаксиса неразрывным целым, не сводимым к другим символам. Другими словами, терминальные символы — это лексемы. Терминальные символы могут состоять из одного или нескольких символов в обычном понимании этого слова. Примером терминальных символов, состоящих из нескольких символов, могут служить зарезервированные слова языка Паскаль и символы операций >=, <= и <>. Чтобы отличать терминальные символы от служебных символов БНФ, мы будем заключать их в одинарные кавычки.

Нетерминальный символ — это некоторая абстракция, которая по определенным правилам сводится к комбинации терминальных и/или других нетерминальных символов. Правила должны быть такими, чтобы существовала возможность выведения из них выражения, полностью состоящего из терминальных символов, за конечное число шагов, хотя рекурсивные определения терминальных символов друг через друга или через самих себя допускаются. Нетерминальные символы имеют имена, которые принято обрамлять угловыми скобками: .

Операция ::= означает определение нетерминального символа. Слева от этого знака ставится нетерминальный символ, смысл которого надо определить, справа — комбинация символов, которой соответствует данный нетерминальный символ. Примером может служить следующее определение:

::= '.'

В данном примере мы определили нетерминальный символ , который можем использовать в дальнейшем, например, при описании синтаксиса записи вещественного числа. Если мы затем захотим поменять разделитель с точки на запятую, нам достаточно будет переопределить смысл символа , а не менять определения всех остальных символов, где встречается этот разделитель.

В более сложных случаях нетерминальному символу ставится в соответствие не один символ, а их цепочка, в которую могут входить как терминальные, так и нетерминальные символы. Примером такого определения может служить описание синтаксиса оператора присваивания в Delphi:

::= ':='

При записи синтаксиса в БНФ часто сначала дают определение абстракции самого верхнего уровня, описывающей все выражение в целом, и только потом — определения абстракций нижнего уровня, которые необходимы при ее определении, т.е. порядок определения абстракций может отличаться от принятого в языках программирования определения идентификаторов, согласно которому идентификатор должен быть сначала описан, и лишь затем использован. В частности, в данном примере символы (переменная) и (выражение) могут быть определены после определения .

Операция | в БНФ означает "или" — показывает одну из двух альтернатив. Например, если под нетерминальным символом может подразумевать знак "+" или "-", его определение будет выглядеть следующим образом:

::= '+' | '-'

Если альтернатив больше, чем две, они записываются в ряд, разделенные символом |, например:

::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

Здесь мы определили нетерминальный символ (цифра), под которым можем понимать один из символов диапазона '0'..'9'.

Операция | подразумевает, что все, что стоит слева от этого знака, является альтернативой того, что стоит справа (до конца определения или до следующего символа |). Если в качестве альтернативы выступает только часть определения, то чтобы обособить эту часть, ее заключают в круглые скобки, например:

::= 'for' ':='

 ('to' | 'downto') 'do'

Здесь с помощью БНФ описан синтаксис оператора for языка Delphi. В квадратные скобки заключается необязательная часть определения, как присутствие, так и отсутствие которой допускается синтаксисом, например:

::= 'if' 'then' ['else' ]

Здесь дано определение условного оператора if языка Delphi. Квадратные скобки указывают на необязательность части else.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже