
- •Министерство образования и науки рф
- •Основы построения трансляторов Курс лекций по дисциплине «Системное программное обеспечение» Красноярск 2010 г.
- •1. Место трансляторов в системном программном обеспечении. Основные фазы процесса трансляции
- •Генерация промежуточного представления
- •Генерация кода
- •Контрольные вопросы
- •2. Базовые понятия теории формальных языков и грамматик
- •2.1. Алфавиты, цепочки и языки. Основные понятия и определения
- •2.2. Представление языков
- •2.3. Грамматики
- •2.3.1. Формальное определение грамматики
- •2.3.2. Классификация грамматик и языков по Хомскому
- •2.3.3. Разбор цепочек
- •2.3.4. Преобразования грамматик
- •2.4. Задачи
- •3. Лексический анализ
- •Описание модельного языка
- •3.1. Сущность и задачи лексического анализа
- •3.2. Способы организации таблиц идентификаторов
- •Организация таблицы идентификаторов в виде неупорядоченного массива записей. Метод линейного поиска.
- •Организация таблицы идентификаторов в виде упорядоченного массива записей. Метод бинарного поиска.
- •Использование бинарного дерева поиска для построения таблицы идентификаторов.
- •Построение таблиц идентификаторов с использованием методов хеширования.
- •3.3. Методы и средства лексического анализа
- •3.4. Недетерминированный разбор
- •3.5 Разработка лексического анализатора для модельного языка Описание модельного паскалеподобного языка (м-языка):
- •Контрольные вопросы
- •4. Синтаксический и семантический анализ
- •4.1. Задачи и методы синтаксического анализа
- •4.2 Сущность метода рекурсивного спуска
- •Void error(); / функция обработки ошибок /
- •4.3. Условия применимости метода рекурсивного спуска
- •4.4. Синтаксический анализатор для м-языка
- •4.5. Семантический анализ
- •4.6. Семантический анализатор для м-языка
- •4.6.1. Обработка описаний
- •Int declare; / описан ? 1-"да", 0-"нет" /
- •Void ipush (int I); / значение I - в стек /
- •Int ipop (void); / из стека - целое /
- •4.6.2. Контроль контекстных условий в выражении
- •Void spush (char s); / значение s - в стек /
- •If (tid [I].Declare) / описан? /
- •4.6.3. Контроль контекстных условий в операторах
- •4.7. Задачи
- •5. Генерация внутреннего представления программ
- •5.1. Язык внутреннего представления программы
- •5.2 Синтаксически управляемый перевод
- •5.3 Генератор внутреннего представления программы на м-языке
- •5.4 Интерпретатор полиЗа для модельного языка
- •5.5 Задачи
- •Литература
3.4. Недетерминированный разбор
При выполнении разбора по регулярной грамматике может оказаться, что несколько разных нетерминалов имеют правила вывода с одинаковыми правыми частями, и поэтому неясно, к какому из них делать свертку (см. п.3.3). В терминах диаграммы состояний это означает, что из одного состояния выходит несколько дуг, ведущих в разные состояния, но помеченных одним и тем же символом. Такой грамматике будет соответствовать недетерминированный конечный автомат.
Недетерминированный конечный автомат (НКА) – это пятерка
(K, V, F, H, S), где
K - конечное множество состояний;
V - конечное множество допустимых входных символов;
F - отображение множества K V в множество подмножеств K;
H K - конечное множество начальных состояний;
S K - конечное множество заключительных состояний.
F(A,t) = {B1,B2,...,Bn} означает, что из состояния A по входному символу t можно осуществить переход в любое из состояний Bi, i = 1, 2, ... ,n.
Таким образом, недетерминизм автомата заключается в следующем:
находясь в некотором состоянии и обозревая текущий символ, автомат может перейти в общем случае в одно из нескольких возможных состояний;
автомат может делать переходы по ε .
Пример 3.4
Для грамматики G = ({a,b, }, {S,A,B}, P, S), где
P={ S A, A a | Bb, B b | Bb}
разбор будет недетерминированным (так как у нетерминалов A и B есть одинаковые правые части Bb). Данной грамматике будет соответствовать полностью определенный недетерминированный конечный автомат, граф переходов которого представлен на рис. 3.9. : M = ({H, A, B, ER, S}, {a, b, }, F, H, {S}), где
F: F(H, a)=A, F(H, b)=B, F(H, )=ER, F(A, )=S, F(A, a)=ER, F(A, b)=ER, F(B, b)={A, B},F(B, a)=ER, F(B, )=ER, F(ER, a)=ER, F(ER, b)=ER,
F(ER, )=ER.
Рис. 3.9. Граф переходов полностью определенного
недетерминированного конечного автомата
В случае недетерминированного разбора входной цепочки символов можно предложить алгоритм, который будет перебирать все возможные варианты сверток (переходов) один за другим; если цепочка принадлежит языку, то будет найден путь, ведущий к успеху; если будут просмотрены все варианты, и каждый из них будет завершаться неудачей, то цепочка языку не принадлежит. Однако такой алгоритм практически неприемлем, поскольку при переборе вариантов мы, скорее всего, снова окажемся перед проблемой выбора и, следовательно, будем иметь "дерево отложенных вариантов".
Важным частным случаем недетерминированного конечного автомата является детерминированный конечный автомат (ДКА), который на каждом такте работы имеет возможность перейти не более чем в одно состояние, а также не может делать переходы по ε.
Один из наиболее важных результатов теории конечных автоматов состоит в том, что класс языков, определяемых недетерминированными конечными автоматами, совпадает с классом языков, определяемых детерминированными конечными автоматами.
Это означает, что для любого НКА всегда можно построить детерминированный КА, определяющий тот же язык. Моделировать работу ДКА значительно проще, чем работу произвольного конечного автомата, поэтому при построении компиляторов используемый произвольный КА обычно стремятся преобразовать в ДКА.
Алгоритм построения ДКА по НКА.
Вход: M = (K, V, F, H, S) - недетерминированный конечный автомат.
Выход: M’ = (K’, V, F’, H’, S’) - детерминированный конечный автомат, допускающий тот же язык, что и автомат М.
Метод:
Множество состояний К’ автомата М’ состоит из всех подмножеств множества К автомата М. Каждое состояние из К’ будем обозначать [A1A2...An], где Ai K.
Функция переходов F’ автомата М’ строится следующим образом: F’ ([A1A2...An], t) = [B1B2...Bm], где для любого 1 i n существует 1 j m так, что F(Ai, t) = Bj .
Пусть H = {H1, H2, ..., Hk}, тогда H’ = [H1, H2, ..., Hk].
Пусть S = {S1, S2, ..., Sp}, тогда S’ - все состояния из K’, имеющие вид [...Si...], Si S для какого-либо 1 i p.
После построения из нового ДКА необходимо удалить все недостижимые состояния.
Состояние kK в конечном автомате M = (K, V, F, H, S) называется недостижимым, если ни при какой входной цепочке wV+ невозможен переход автомата из начального состояния Н в состояние k. Иначе состояние называется достижимым.
Алгоритм удаления недостижимых состояний.
Пусть R – множество достижимых состояний; Рi – множество текущих активных состояний автомата M = (K, V, F, H, S) на i-м шаге алгоритма. Результатом работы алгоритма является полное множество достижимых состояний R.
1.
2.
3.
4.
Если
,
то выполнение алгоритма закончено,
иначе
.
Перейти к шагу 3.
Рассмотрим пример, иллюстрирующий работу алгоритма преобразования недетерминированного КА в ДКА.
Пример 3.4
Пусть дан конечный автомат M = ({H, A, B, S}, {0, 1}, F, {H}, {S}), где F: F(H, 1) = B, F(B, 0) = A, F(A, 1) = B, F(A, 1) = S .
Граф переходов данного автомата выглядит следующим образом (рис. 3.10):
Рис. 3.10. Граф переходов недетерминированного КА
Очевидно, что заданный конечный автомат является недетерминированным, так как из состояния А по символу ‘1’ возможен переход как в состояние В, так и в состояние S. Преобразуем заданный НКА в детерминированный КА.
Множество состояний эквивалентного ДКА будет следующим:
K’ = {[H], [A], [B], [S], [HA], [HB], [HS], [AB], [AS], [BS], [HAB], [HAS], [ABS], [HBS], [HABS]}
Построим функцию переходов эквивалентного ДКА:
F’([A], 1) = [BS] F’([H], 1) = [B]
F’([B], 0) = [A] F’([HA], 1) = [BS]
F’([HB], 1) = [B] F’([HB], 0) = [A]
F’([HS], 1) = [B] F’([AB], 1) = [BS]
F’([AB], 0) = [A] F’([AS], 1) = [BS]
F’([BS], 0) = [A] F’([HAB], 0) = [A]
F’([HAB], 1) = [BS] F’([HAS], 1) = [BS]
F’([ABS], 1) = [BS] F’([ABS], 0) = [A]
F’([HBS], 1) = [B] F’([HBS], 0) = [A]
F’([HABS], 1) = [BS] F’([HABS], 0) = [A]
Начальное состояние эквивалентного ДКА:
S’ = {[S], [HS], [AS], [BS], [HAS], [ABS], [HBS], [HABS]}
Применим алгоритм удаления недостижимых состояний.
Множество достижимых состояний ДКА: R={[H], [B], [A] и [BS]}, поэтому все остальные состояния удаляются.
Таким образом, M’ = ({[H], [B], [A], [BS]}, {0, 1}, F’, H, {[BS]}), где
F’([A], 1) = [BS] F’([H], 1) = [B]
F’([B], 0) = [A] F’([BS], 0) = [A]
Обозначим состояние BS как S, тогда
M’ = ({[H], [B], [A], [S]}, {0, 1}, F’, H, {[S]}), где
F’([A], 1) = [S] F’([H], 1) = [B]
F’([B], 0) = [A] F’([S], 0) = [A]
Граф переходов полученного ДКА изображен на рис. 3.11.
Рис. 3.11. Граф переходов детерминированного КА
Э
тот
автомат легко преобразовать к полностью
определенному виду (рис. 3.12):
Рис. 3.12. Граф переходов полностью определенного детерминированного КА
В процессе построения распознавателей при решении вопроса о необходимости преобразования НКА в ДКА следует руководствоваться принципом разумной достаточности, так как при выполнении преобразований число состояний автомата может значительно возрасти, что, в свою очередь, влечет за собой увеличение затрат на моделирование. Поэтому не всегда выполнение преобразования автомата к детерминированному виду является обязательным.