Пред.Страница  След.Страница   Раздел   Содержание


1.5.3. Пример построения грамматик

Применение приведенных рекомендаций рассмотрим на следующем примере. Требуется построить грамматику для языка L ,терминальный словарь которого Vт = {*, |}, а цепочки, образующие язык, имеют следующую структуру:

а) каждая цепочка начинается буквой * и заканчивается двумя буквами **.
b) между началом и концом цепочек могут быть:

b1) либо непустая последовательность палочек
b2) либо несколько таких последовательностей, разделенных символами *.

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

* |||**,
* |*|*|**,
* ||*||||*|||||** ,
* |||*|*||*||||||** .

2. Рассматривая приведенные цепочки, можно выделить следующие их структурные компоненты:

3. Обозначим группу палочек символом <A>, а последовательность групп палочек символом <B>.
4. Выделенные структуры можно рассматривать как списки. Так последовательность палочек представляет собой список без разделителей, элементом которого является палочка. Правила грамматики, задающей такой список, имеют вид:

<A> ® | <B>,
<B> ® | <B>,
<B> ® $.

Последовательность групп палочек, разделенных звездочкой, представляет собой список с разделителем, элементом такого списка является группа палочек <A>, а разделителем - звездочка. Правила грамматики, задающей такой список, можно записать так:

<C> ® <A><E>,
<E> ® *<A><E>,
<E> ® $.

Учитывая, что каждая цепочка языка должна иметь начало и конец, и , выбирая в качестве начального символа грамматики <I>, получаем правило, определяющее общий вид цепочки:

<I> ® *<C>**.

5. Объединяя построенные правила, окончательно получаем схему искомой грамматики в виде:

 

Г1. 19:    R = { <I> ® *<C>**,

<C> ® <A><E>,
<E> ® *<A><E>,
<E> ® $,
<A> ® | <B>,
<B> ® | <B>,
<B> ® $ }

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

 

<I> Þ *<C>** Þ *<A><E>** Þ *<A>*<A><E>** Þ

 *<A>*<A>*<A><E> Þ *<A>*<A>*<A>** Þ
 *<A>*<A>* | <B>**
Þ *<A>*<A>* | ** Þ
 *<A>* | <B>* | **
Þ *<A>* | * | ** Þ
 * | <B>* | * | **
Þ * | * | * | **.

 

Построенный вывод иллюстрирует возможность порождения цепочек заданного языка с помощью построенной грамматики.

Одной из основных областей применения формальных грамматик является описание языков программирования. Учитывая широкое использование подобных описаний в литературе и их важное значение для создания компиляторов, рассмотрим построение грамматик для основных конструкций языков программирования. Чтобы сократить размеры грамматик, на рассматриваемые конструкции накладываются некоторые, иногда существенные, ограничения.


Пред.Страница  След.Страница   Раздел   Содержание