Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

5.4 Контекстно-свободные грамматики

Многие языки программирования по своей природе имеют рекурсивную структуру, которая может определяться контекстно-свободными грамматиками. Например, условная инструкция, определяется следующим правилом.

Если S1 и S2 являются инструкциями, а E — выражением, то

if E then S1 else S2 (5.1)

является инструкцией

Этот тип условных инструкций не может быть определен с использованием регуляр­ных выражений. Используя для обозначения класса инструкций синтаксическую переменную stmt, а для класса выражений — ехрr, можно выразить (5.1) с помощью продукции грамматики

stmt —> if expr then stmt else stmt (5.2)

Определение контекстно-свободной грамматики включает в себя понятия терминалов, нетерминалов, стартового символа и про­дукций.

  1. Терминалы представляют собой базовые символы, из которых формируются строки. В (5.2) каждое из ключевых слов if, then, else является терминалом.

  2. Нетерминалы представляют собой синтаксические переменные, которые обозначают множества строк. В (5.2) stmt и ехрr являются нетерминалами. Нетерминалы определяют множества строк, которые помогают в определении языка, порождаемого грамматикой. Кроме того, они налагают на язык иерархическую структуру, облегчающую синтаксический анализ и трансляцию.

  3. Один из нетерминалов грамматики считается стартовым символом, и множество строк, которые он обозначает, является языком, определяемым грамматикой.

  4. Продукции грамматики определяют способ, которым терминалы и нетерминалы могут объединяться для создания строк. Каждая продукция состоит из нетерминала, за которым следует стрелка (или символ : : = , если грамматика записана в форме Бэкуса–Наура), и строка нетерминалов и терминалов.

  5. Общий вид правил A, где AN, V+.

Пример 9

Грамматика со следующими продукциями определяет простые арифметические вы­ражения.

ехрr —> ехрr ор ехрr

ехрr —> ( ехрr)

ехрr —> - ехрr

ехрr —> id

ор —> +| - | * | / |

В этой грамматике терминальными символами являются

id + - * / ( )

Нетерминальные символы грамматики — ехрr и ор; стартовым символом грамматики является ехрr. '

Соглашения по обозначениям при записи грамматик:

Символы являются терминалами:

1) строчные буквы из начала алфавита, такие как а, b, с;

2) символы операторов, такие как +,-и т.п.;

3) символы пунктуации, такие как запятые, скобки и т.п.;

4) цифры 0, 1, .,., 9;

5) строки, выделенные полужирным шрифтом, такие как id или if.

Символы являются нетерминалами:

1) прописные буквы из начала алфавита, такие как А, В, С;

2) буква S, которая обычно означает стартовый символ;

3) имена из строчных букв, выделенные жирным шрифтом, такие как stmt или ехрr.

5. Строчные греческие буквы, такие как α, β представляют строки грамматических символов. Таким образом, в общем виде продукция может быть записана как А —> α, в которой одиночный нетерминал А располагается слева от стрелки (в левой части продукции), а строка грамматических символов α — справа от стрелки (в правой части продукции).

  1. Если А  α 1 А  α 2, ..., А  α k представляют собой продукции с А в левой части, что можно записать А  α 1 | α 2 |…| α k. называются альтернативами А.

Пример 10

Используя приведенные соглашения, можно записать грамматику из примера 5.2 в следующем виде:

E->E A E | (E) | -E | id

A-> +| - | * | / |

Из соглашений следует, что E и А — нетерминалы, причем E является старто­вым символом. Остальные символы представляют собой терминалы.