
- •Содержание
- •Введение
- •1.3. Множества цепочек
- •1.4. Языки
- •1.5. Алгоритмы
- •1.6. Некоторые понятия теории графов
- •Контрольные вопросы
- •2. Введение в компиляцию
- •2.1. Задание языков программирования
- •2.2. Синтаксис и семантика
- •2.3. Процесс компиляции
- •2.4. Лексический анализ
- •2.5. Работа с таблицами
- •Переменная с плавающей точкой
- •2.6. Синтаксический анализ
- •2.7. Генератор кода
- •2.8. Оптимизация кода
- •2.8. Оптимизация кода
- •2.9. Исправление ошибок
- •2.10. Резюме
- •Контрольные вопросы
- •3. Теория языков
- •3.1. Способы определения языков
- •3.2. Грамматики
- •3.4. Распознаватели
- •3.5. Регулярные множества, их распознавание и порождение
- •5.2. LR(1) - таблица разбора
- •5.3. Построение LR – таблицы разбора
- •5.4. Сравнение LL – и LR – методов разбора
- •Контрольные вопросы
- •6. Оптимизация кода
- •6.1. Оптимизация линейного участка
- •6.1.1. Модель линейного участка
- •6.1.2. Преобразование блока
- •6.1.3. Графическое представление блоков
- •6.1.4. Критерий эквивалентности блоков
- •6.1.5. Оптимизация блоков
- •6.1.6. Алгебраические преобразования
- •6.2. Арифметические выражения
- •6.2.1. Модель машины
- •6.2.2. Разметка дерева
- •6.2.3. Программы с командами STORE
- •6.2.4. Влияние некоторых алгебраических законов
- •6.3. Программы с циклами
- •6.3.1. Модель программы
- •6.3.2. Анализ потока управления
- •Алгоритм вычисления прямого доминирования
- •6.3.3. Примеры преобразования программ
- •Удаления бесполезных операторов
- •Замена сложных операций
- •6.3.4. Оптимизация циклов
- •Перемещение кода
- •Индуктивное перемещение
- •Замена сложных операций
- •6.4. Анализ потоков данных
- •6.4.1. Интервалы
- •6.4.2. Анализ потоков данных с помощью интервалов
- •6.4.3. Несводимые графы управления
- •7. Включение действий в синтаксис
- •7.1. Получение четверок
- •7.2. Работа с таблицей символов
- •Контрольные вопросы
- •8. Проектирование компиляторов
- •8.1. Число проходов
- •8.2. Таблицы символов
- •8.3. Таблица видов
- •Контрольные вопросы
- •9. Распределение памяти
- •9.1. Стек времени прогона
- •9.2. Методы вызова параметров
- •9.3. Обстановка выполнения процедур
- •9.4. «Куча»
- •9.5. Счетчик ссылок
- •9.6. Сборка мусора
- •Контрольные вопросы
- •10. Генерация кода
- •10.1. Генерация промежуточного кода.
- •10.2. Структура данных для генерации кода
- •10.3. Генерация кода для типичных конструкций
- •10.3.1. Присвоение
- •10.3.2. Условные зависимости
- •10.3.3. Описание идентификаторов
- •10.3.4. Циклы
- •10.3.5. Вход и выход из блока
- •10.3.6. Прикладные реализации
- •10.4. Проблемы, связанные с типами
- •10.5. Время компиляции и время прогона
- •Контрольные вопросы
- •11. Исправление и диагностика ошибок
- •11.1. Типы ошибок
- •11.2. Лексические ошибки
- •11.3. Ошибки в употреблении скобок
- •11.4. Синтаксические ошибки
- •11.5. Методы исправления синтаксических ошибок
- •11.6. Предупреждения
- •11.7. Сообщения о синтаксических ошибках
- •11.8. Контекстно-зависимые ошибки
- •11.9. Ошибки, связанные с употреблением типов
- •11.10. Ошибки, допускаемые во время прогона
- •Контрольные вопросы
- •Список литературы

20
1.6. Некоторые понятия теории графов
Ориентированные графы
Определение.
Неупорядоченный ориентированный граф G – это пара (A, R): A – множество элементов, называемых вершинами;
R – отношения на множестве А.
Пример:
G=(A, R), A={1, 2, 3, 4}, R={(1, 1), (1, 2), (2, 3), (2, 4), (3, 4), (4, 1), (4, 3)} (рис. 1.7).
2
1 |
4 |
3
Рис. 1.7. Пример ориентированного графа
Пара (a, b) – называется дугой (или ребром) графа G.
Определение.
Пусть G1=(A1, R1) и G2=(A2, R2) - G1 и G2 равные (изоморфные), если существует биективное отображение f:A1®A2 такое, что aR1b тогда и только тогда, когда f(a)R2f(b), т.е. в графе G1 из вершины а в вершину b ведет дуга тогда и только тогда, когда в графе G2 из вершины, соответствующей а, ведет дуга, соответствующая вершине b.
Части вершинам и/или дугам графа иногда приписывают некоторую информацию (разметку). Такие графы называются помеченными.
Определение.
(A, R) – граф. Разметкой графа называется пара функций f и g, где f (разметка вершины) отображает А в некоторое множество, а g (разметка дуг) отображает R в некоторое(возможно отличное от первого) множество.
21
Пусть G1=(А1, R1) и G2=(А2, R2) – равные помеченные графы, если существует такое биективное отображение h: A1,….,An, что:
1)aR1b тогда и только тогда, когда h(a)R2h(b), т.е. графы равны как непомеченные;
2)f1(a)=f2(h(a)), т.е. соответствующие вершины имеют одинаковые метки;
3)g1((a,b))=g2((h(a), h(b))), т.е. соответствующие дуги имеют оди-
наковые метки.
Пример. G1={{a, b, c}{(a, b), (b, c), (c, a)}} и G2={{0, 1, 2}{(1, 0), (2, 1), (0, 2)}} (рис. 1.8).
Разметка графа G1 определяется формулами: f (a) = f1 (b) = x;
f1 (c) = y;
g1 ((a, b)) = g1 ((b, c)) = a;
g1 ((c, a)) = b.
Разметка графа G2 определяется формулами f2 (0) = f2 (2) = x;
f1 (1) = y;
g2 ((0, 2)) = g 2 ((2,1)) = a;
g2 ((1, 0)) = b.
Графы равны.
Определение.
Последовательность вершин (а0, а1, …, аn), n³1 называется путем длины n из вершины а0 в вершину аn , если для каждого 1£ i£ n существует дуга, выходящая из аi-1 и входящая в вершину аi.
Циклом называется путь (а0, а1, …, аn), в котором а0 = аn .
Граф называется сильно связанным, если для двух различных вершин a и b существует путь из а в b.
Степенью по входу вершины а назовем число входящих в нее дуг, степенью по выходу – число выходящих из нее дуг.

|
|
|
22 |
|
|
x |
|
|
y |
|
b |
|
|
1 |
a |
a |
|
b |
a |
x a |
|
c y |
x 0 |
2 x |
|
b |
|
|
a |
Рис. 1.8. Равные помеченные графы
Ориентированные ациклические графы
Ациклическим графом называется граф, не имеющий циклов(рис. 1.9).
Вершина, степень, по входу которой 0, называется базовой. Вершина, степень, по выходу которой0, называется листом (или
концевой вершиной).
Если (a, b) – дуги ациклического графа, то а называется прямым предком b, а b – прямым потомком а.
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Рис. 1.9. Пример ациклического графа
Деревья
Определение.
Деревом Т называется ориентированный графG=(A, R) со специальной вершиной rÎA, называемой корнем, у которого:
1)степень по входу r равна 0;
2)степень по входу всех остальных вершин дерева Т равна 1;

23
3) каждая вершина достижима из r.
Определение.
Поддеревом дерева Т=(A, R) называется любое дерево Т¢=(A¢, R¢), у которого (рис. 1.10):
1)A¢ не пусто и содержится в А;
2)R¢=(A¢´ A¢) Ç R;
3)ни одна вершина A - A¢ не является потомком вершины A¢.
1 |
3 |
2 |
3 |
4 |
5 |
6 |
4 |
5 |
6 |
Рис. 1.10. Примеры дерева
Упорядоченные графы
Упорядоченным графом называется пара (A, R), где А - множество вершин, а R – множество линейно упорядоченных списков дуг, каждый элемент которого имеет вид ((a, b1), (a, b2),…,(a,bn)) (рис. 1.11).
Этот элемент показывает, что из вершины а выходит n дуг, причем первой из них считается дуга, приходящая в b1 , второй - в b2 и т.д.
Разметкой упорядоченного графаG=(A, R) назовем такую пару функций f и g, что:
1)f:A®S для некоторого множества S (f помечает вершины);
2)g отображает R в последовательность символов из некоторого множества Т так, что образом списка ((a, b)). ((a, b)) является последовательность из n символов (помеченные дуги).