
- •Обзорная лекция по курсу «языки программирования и методы трансляции»
- •Основная литература
- •1 Описание языка программирования
- •2 Введение в трансляцию
- •3 Способы описания языка
- •4 Формальные языки и грамматики. Основные термины и определения
- •5 Порождающие грамматики (Грамматики н.Хомского1)
- •6 Классификация формальных грамматик
- •7 Автоматные грамматики и конечные автоматы
- •7.1. Механизмы распознавания и преобразования
- •7.2 Конечные автоматы
- •7.3 Способы задания конечных автоматов
- •Контекстно-свободные грамматики и языки
- •Проверка существования языка
- •Удаление бесполезных символов грамматики
- •Эквивалентные преобразования кс-грамматик
- •9.1 Устранение цепных правил
- •Удаление произвольного правила
- •9.3 Левая факторизация правил
- •9.4 Преобразование к нормальной форме Хомского
- •Распознающий автомат для кс- языков (автомат с магазинной памятью)
- •Разнозновидности мп-автоматов
- •11 Методы синтаксического анализа
- •Нисходящий разбор
- •Восходящий разбор
- •12 Генерация внутреннего представления программ
- •12.1 Польская запись
- •2 Алгоритм перевода на промежуточный язык
- •2.1 Полиз как промежуточный язык
7 Автоматные грамматики и конечные автоматы
7.1. Механизмы распознавания и преобразования
Разработка и применение языков обычно требуют проработки по крайней мере двух основных проблем:
должен быть создан механизм порождения языка, т.е. система описания строк языка
решена задача проверки принадлежности заданной строки заданному языку
Для решения второй проблемы создается механизм распознавания или распознаватель.
Распознаватель схематично можно представить в виде совокупности входной ленты, управляющего устройства и вспомогательной памяти.
Входная
лента
Входная головка
Распознаватель выполняет некоторую последовательность шагов, каждый из которых включает:
чтение текущего символа входной ленты;
анализ входного символа, содержимого памяти и текущего состояния;
перемещение (если нужно) входной головки;
изменение содержимого памяти;
изменение состояния распознавателя.
Поведение распознавателя можно проследить по его конфигурациям. Конфигурация – это как бы мгновенный снимок распознавателя, на котором зафиксированы:
состояние управляющего устройства;
содержимое входной ленты и положение входной головки;
содержимое вспомогательной памяти.
Управляющее устройство называется детерминированным, если для каждой конфигурации распознавателя существуют не более одного возможного следующего шага. Недетерминированное управляющее устройство для каждой конфигурации имеет конечное множество возможных следующих шагов.
Для каждого класса грамматик из иерархии Хомского существует класс распознавателей, определяющих тот же класс языков.
Распознаватели для языков класса 3 называют конечными автоматами, для языков класса 2 – автоматами с магазинной памятью, для языков класса 1 – линейными ограниченными автоматами (машинами Тьюринга с конечным объемом ленты), для языков класса 0 – машинами Тьюринга.
7.2 Конечные автоматы
Определение языка конечными средствами возможно не только при помощи формальных грамматик, но также путем использования математической модели устройства, распознающего предложения языка.
Конечный автомат – это простейший распознаватель (см. п.2) без вспомогательной памяти.
Конечный автомат действует следующим образом:
В начале он находится в состоянии S
На вход КА поступают символы входной ленты, принадлежащие входному алфавиту
Находясь в некотором состоянии и получив на вход очередной символ, автомат переходит в следующее состояние, определяемое значением функции переходов для данной пары символ-состояние, и считывает очередной символ.
Конечным автоматом (КА) называется пятерка:
К=(Q, , , q0, F)
Где
Q – конечное множество состояний автомата
– входной алфавит – конечное множество символов
– функция переходов автомата (в общем случае неоднозначная): отображение множества Q в множество P(Q), т.е. : (Q ) P(Q) , где P(N) – множество всех подмножеств множества N
q0 – начальное состояние. g0 Q;
F – множество конечных (финишных) состояний FQ (F включается в Q)
Формально конфигурацией автомата называется пара (q, ) Q *, конфигурация (q0, ) называется начальной, а (q , ), где q F – заключительной.
Такт работы КА представляется бинарным отношением (├), определенным на множестве конфигураций. Если q’ (q, a), то (q, aw) ├ (q’, w) для всех w *.
Говорят, что конечный автомат К=(Q, , , q0, F) допускает (распознает) входную цепочку w , если (q0, w) ├ (q, ) для некоторого q F.
Языком, определяемым (допускаемым, распознаваемым) КА, называется множество всех входных цепочек, допускаемых этим автоматом, т.е.
L(K) = {w | w и (q0, w) ├ *(q, ) для некоторого q F }
Пример 1. Рассмотрим КА К = ({q0, q1, q2, q3,}, {a, b}, , q0, { q3} ), в котором функция переходов выглядит следующим образом:
-
1) (q0, a) = {q1}
2) (q0, a) = {q0}
3) (q1, a) = {q1}
4) (q1, b) = {q2}
5) (q2, a) = {q3}
6) (q2, b) = {q0}
7) (q3, a) = {q3}
8) (q3, b) = {q3}
Для входной цепочки baababa автомат выполнит следующую последовательность действий:
(q0, baababa) ├ (q0, aababa) ├ (q1, ababa) ├ (q1, baba) ├ (q2, aba) ├ (q3, ba) ├ (q3, a) ├ (q3, )
Таким образом, цепочка baababa принадлежит языку L(K)