Формальные языки, грамматики и автоматы1 / Konspekt / SECTION1 / part153
.htmПред.Страница След.Страница Раздел Содержание
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>* | * | ** Ю * | * | * | **. Построенный вывод иллюстрирует возможность порождения цепочек заданного языка с помощью построенной грамматики. Одной из основных областей применения формальных грамматик является описание языков программирования. Учитывая широкое использование подобных описаний в литературе и их важное значение для создания компиляторов, рассмотрим построение грамматик для основных конструкций языков программирования. Чтобы сократить размеры грамматик, на рассматриваемые конструкции накладываются некоторые, иногда существенные, ограничения.
Пред.Страница След.Страница Раздел Содержание