- •1. Формальные языки и грамматики
- •1.1. Введение
- •1.1.1. Трансляторы, интерпретаторы и компиляторы
- •1.1.2. Стадии работы компилятора
- •1.1.3. Построение компилятора
- •1.2. Определение формальной грамматики и языка
- •1.2.1. Первичные понятия
- •1.2.2. Примеры, иллюстрирующие первичные понятия
- •1.2.3. Пустой язык
- •1.2.4. Резюме
- •1.3. Типы формальных языков и грамматик
- •1.3.1. Грамматики типа 0
- •1.3.2. Грамматики типа 1
- •1.3.3. Грамматики типа 2
- •1.3.4. Грамматики типа 3
- •1.3.5. Вывод в кс-грамматиках и правила построения дерева вывода
- •1.3.6. Синтаксический разбор
- •1.3.7. Левый и правый выводы
- •1.3.8. Неоднозначные и эквивалентные грамматики
- •1.3.9. Резюме
- •1.4. Способы задания схем грамматик
- •1.4.1. Форма Наура-Бэкуса
- •1.4.2. Итерационная форма
- •1.4.3. Синтаксическая диаграмма
- •1.4.4. Резюме
- •1.5. Построение грамматик и грамматики, описывающие основные конструкции языков программирования
- •1.5.1. Рекомендации по построению грамматик
- •1.5.2. Описание списков
- •1.5.3. Пример построения грамматик
- •1.5.4. Грамматики, описывающие целые числа без знака и идентификаторы
- •1.5.5. Грамматики для арифметических выражений
- •1.5.6. Грамматика для описаний
- •1.5.7. Грамматика, задающая последовательность операторов присваивания
- •1.5.8. Грамматики, описывающие условные операторы и операторы цикла
- •1.5.9. Резюме
- •2. Автоматные грамматики и распознаватели
- •2.1. Автоматные распознаватели
- •2.2. Недетерминированные распознаватели
- •2.3. Преобразование некоторых типов языков и грамматик к автоматному виду.
- •2.4 Построение распознавателя для заданного конечного языка
- •2.5 Минимизация числа состояний распознавателя
- •2.6 Резюме
- •3. Контекстно-свободные грамматики и магазинные автоматы.
- •3.1 Приведенные грамматики.
- •3.2.Преобразование кс-грамматик
- •3.3 Магазинные автоматы.
- •3.4. Нисходящие распознаватели, ll(k) и разделенные грамматики. Построение распознавателя.
- •3.5. Функции перв, след и выбор.
- •3.6. Слаборазделенные и ll(1) - грамматики. Преобразование грамматик к виду ll(1)
1.2.2. Примеры, иллюстрирующие первичные понятия
Рассмотрим несколько примеров, иллюстрирующих введенные понятия:
а) Задана грамматика Г1. 0 и требуется определить язык, порождаемый этой грамматикой:
Г1. 0: Vт = {a, b, c}, Va = {<I>}, R = {<I> ® abc}.
Схема грамматики содержит одно правило, поэтому Г1. 0 порождает язык из одного слова
L(Г1. 0) = {abc}.
b) Задана грамматика Г1. 1 и требуется определить язык, порождаемый этой грамматикой .
Г1. 1 : Vт = {a, b, c}, Va = {<I>, <B>, <C>}
R = { <I> ® a<B>,
<B> ® <C>d, <B> ® dc, <C> ® $}.
Построим все выводы в этой грамматике:
<I> Þ a<B> Þ a<C>d Þ ad, <I> Þ a<B> Þ adc.
Следовательно язык L(Г1. 1) = {adc, ad}. в) Задана грамматика Г1. 2 и требуется определить язык, порождаемый этой грамматикой .
Г1. 2 : Va = {<I>, <A>}, Vт = {0, 1},
R = {<I> ® 0<A>1,
0<A> ® 00<A>1, <A> ® $}.
Рассмотрим несколько выводов с помощью правил грамматики Г1. 2. Применяя первое и третье правила, получаем:
<I> Þ 0<A>1 Þ 01.
Применяя два раза первое правило и третье, имеем
<I> Þ 0<A>1 Þ 00<A>11 Þ 0011.
В общем случае, применяя K раз первое правило, получим в результате цепочку, содержащую K нулей и K единиц. Следовательно, язык, порождаемый грамматикой Г1. 2, содержит всевозможные цепочки, в которых число нулей равно числу единиц. г) Задана грамматика Г1. 3 и требуется построить язык, порождаемый этой грамматикой.
Г1. 3 : Vт = {a, b}, Va = {<I>, <A>},
R = { <I> ® a<A>, <A> ® b<A>}.
Попытка построения вывода в этой грамматике приводит нас к цепочке:
<I> Þ a<A> Þ ab<A> Þ abb<A> Þ... ,
которая оказывается бесконечной. Другими словами, Г1. 3 порождает пустой язык.
1.2.3. Пустой язык
Определение. Если язык, порождаемый грамматикой Г, не содержит ни одной конечной цепочки (конечного слова), то он называется пустым. Утверждение. Для того, чтобы язык L( Г ) не был пустым, в множестве R должно быть хотя бы одно правило вида r = c ® y, где y Î Vт* и должен существовать вывод <I> Þ* c. |
1.2.4. Резюме
Для построения компилятора необходимо иметь точное и недвусмысленное описание входного и выходного языков, синтаксиса и семантики. Для задания синтаксиса языка используются формальные грамматики. Грамматика определяется терминальным словарем, множеством правил и начальным символом. С помощью правил грамматики можно строить выводы цепочек, состоящих из терминальных символов. Множество таких цепочек, выводимых из начального символа грамматики, образует формальный язык, задаваемый грамматикой. |
1.3. Типы формальных языков и грамматик
В теории формальных языков выделяются 4 типа грамматик, которым соответствуют 4 типа языков. Эти грамматики выделяются путем наложения усиливающихся ограничений на правила грамматики.
1.3.1. Грамматики типа 0
Грамматики типа 0, которые называют грамматиками общего вида, не имеют никаких ограничений на правила порождения. Любое правило
r = h ® y
может быть построено с использованием произвольных цепочек h, y Î (Vт È Va)*. Например,
<T><W> ® <W><T> или x<A>b<C><D> ® x<H><D>.