Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_раб_1_4.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
622.08 Кб
Скачать

Формы записи грамматики

Форма Бэкуса-Наура

При описании синтаксиса конкретных языков программирования приходится вводить большое число нетерминальных символов, и символическая форма записи теряет свою наглядность. В этом случае применяют форму Наура-Бэкуса (ФНБ), которая предполагает использование в качестве нетерминальных символов комбинаций слов естественного языка, заключенных в угловые скобки, а в качестве разделителя - специального знака, состоящего из двух двоеточий и равенства. Например, если правила <L><L> и <L><E> записаны в символической форме, и символ <L> соответствует синтаксическому понятию "список", а символ <E> - "элемент списка", то их можно представить в форме Наура-Бэкуса так:

<список>::= <элемент списка><список>, <список>::= <элемент списка>.

Чтобы сократить описание схемы грамматики, в ФБН разрешается объединять правила c одинаковой левой частью в одно правило, правая часть которого должна включать правые части объединяемых правил, разделенные вертикальной чертой. Используя объединение правил, для рассматриваемого примера получаем:

<список>::=<элемент списка><список>|<элемент списка>.

Один из наиболее распространенных способов описания синтаксиса языка – это форма Бэкуса-Наура (Backus J.W., Naur P.)[19]. Этот способ был разработан для описания Алгола-60, однако, в дальнейшем он использован для многих других языков. При записи грамматики в форме Бэкуса-Наура используются два типа объектов:

• основные символы (или терминальные символы, в частности, ключевые слова)

• металингвистические переменные (или нетерминальные символы),

значениями которых являются цепочки основных символов описываемого языка. Металингвистические переменные изображаются словами (русскими или английскими), заключенными в угловые скобки (<...>)

металингвистические связки (::=, |)

Итерационная форма

Для получения более компактных описаний синтаксиса применяют итерационную форму описания. Такая форма предполагает введение специальной операции, которая называется итерацией и обозначается парой фигурных скобок со звездочкой. Итерация вида {a}* определяется как множество, включающее цепочки всевозможной длины, построенные с использованием символа a, и пустую цепочку.

{a}* = {$, a, aa, aaa, aaaa,...}.

Иcпользуя итерацию для описания множества цепочек, задаваемых символическими правилами, для списка получаем:

<L><E> {<E>}*.

Например, описание множества цепочек, каждая из которых должна начинаться знаком # и может состоять из произвольного числа букв x и y, может быть представлено в итерационной форме так:

<I>#{x | y}* .

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

<A>x<A>y<B>z и <A>x<B>z

могут быть записаны так:

<A>x[<A>y]<B>z.

Форма Бэкуса-Наура не позволяет задавать контекстные условия. При использовании формы Бэкуса-Наура контекстные условия задаются в словесной форме. Аббревиатура BNF как Backus-Naur-Form (БНФ), а ранее она означала Backus-Normal-Form

Вернёмся к нашему предложению и опишем его метаязыком в БНФ

Пусть синтаксис или грамматика заданы следующими правилами

<предложение> ::= < прилагательное >< подлежащее >< сказуемое >< существительное >

Эта грамматика допускает лишь первый вариант предложения и не допускает второго варианта с другой семантикой.

Таким образом, на этом примере видно, что синтаксис может влиять на семантику, т.е. определять смысловое содержание предложения.

При определении синтаксиса языков Pascal и Modula-2 использовал расширенную форму Бэкуса-Наура (EBNF):

• Нетерминалы записываются как отдельные слова

• Терминалы записываются в кавычках, например, “BEGIN”

• Вертикальная черта ( | ), как и прежде, используется для определения альтернатив

• Круглые скобки используются для группировки

• Квадратные скобки используются для определения возможного вхождения символа или группы символов

• Фигурные скобки используются для определения возможного повторения символа или группы символов

• Символ равенства используется вместо символа

• Символ точка используется для обозначения конца правила

• Комментарии заключаются между символами (* … *)

• эквивалентно [ ]

Пример:

Целое = Знак ЦелоеБезЗнака.

ЦелоеБезЗнака = Цифра {Цифра}.

Знак = ["+"|"–"].

Цифра = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9".

В 1981 году Британский институт стандартов (British Standards Institute) опубликовал стандарт EBNF. BSI стандарт получился более наглядным, чем расширенная форма Бэкуса-Наура, предложенная Виртом.

Элементы правил разделяются запятыми

Правила заканчиваются точкой с запятой

Пробелы не являются значащими

Пример.

Константа = "CONST",

Идентификатор Константы , "=", Выражение Константы, ";",

{Идентификатор Константы, "=", Выражение Константы, ";"};

Идентификатор Константы = identifier;

Выражение Константы == Выражение;

Существуют и другие формы представления грамматик, например ван Вейнгаардена., которые использовались для описания синтаксиса ALGOL 68. Грамматику ван Вейнгаардена называют еще метаграмматикой.