
- •Содержание
- •Введение
- •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. Ошибки, допускаемые во время прогона
- •Контрольные вопросы
- •Список литературы
107
С¬qB1…Br, а все вхождения A в области действия оператораSi заменены на С. Если U лежит в области оператора Si, то U¢ - это U, в котором переменная А заменена на С. В противном случае U¢ = U.
Пример. Пусть = (P, {A, B}, {F}), где Р состоит из
T ¬ A*B
T ¬ T+A
F ¬ T*T
Одно применение Т3 позволяет изменить имя переменнойТ, на S.
Таким образом ¢ =( P¢, {A, B},{F})
S ¬ A*B
T ¬ S+A
F ¬ T*T.
Т4: Перестановка
Пусть =(P, I, U) - блок, в котором операторомSi является
A¬qB1…Br оператором Si+1 является C¬yD1…Ds, А не совпадает ни с одной переменной С, D1,… Ds и С не совпадает с и с одной из пере-
менных из А, B1…Br тогда преобразованиеТ4 отображает блок в¢=(P¢, I, U¢) где P¢ - это Р в котором Si и Si+1 переставлены.
Пример. Пусть =(P,{A, B},{F, G}), где Р состоят из правил
F¬A+B
G¬A*B.
Можно применить Т4 и отобразить в (P¢, {A, B},{F, G}), где P¢ состоит из правил
G¬A*B
F¬A+B.
6.1.3.Графическое представление блоков
Для каждого блока =(P, I, U) можно найти ориентированный
ациклический граф D, естественным образом представляющий . Каждый лист графаD соответствует одной входной переменной Iв, а каждая его внутренняя переменная вершинаоператор из P. К таким графам легко применить рассмотренные нами преобразования.
Определение. Пусть =(P, I, U) – блок. Построим помеченный граф
D( ):
1)Пусть Р=S1, S2,…,Sn

108
2)Для каждой переменной АÎI образуем вершину с меткойА и будем называть её последним определением для А.
3)Для i=1,2…n делаем следующие: пусть А¬qB1 B2 … Br образуем новую вершину, помеченную q, из которой выходят r ориентированных дуг. Пусть j дуга (при упорядоченье дуг слева направо) указывает на последнее определение дляВj 1≤j≤r. Новая вершина, по-
мечена q, становится последним определением А этой вершине соответствует оператору Si в D.
4) После шага 3) вершины, являющиеся последним определением входных переменных, помечаются как выделенные и отмечаются кружками
Пример: пусть =(Р, {A, B},{F, G})- блок в котором Р составляет
из операторов. Граф D( ) изображен на рис. 11.1.
T¬A+B
F¬A*T
T¬B+F
G¬B*T
+ n4
+ n3
* n2
+ n1
A B
Рис. 11.1. Пример ориентированного ациклического графа.
Четыре оператора из блока соответствуют по порядку вершинам n1, n2, n3 и n4
109
*
Каждый граф представляет класс эквивалентности Û . Если блок
3,4
1 с помощью последовательности преобразований T3 и T4 можно пре-
образовать в блок 2, то блок 1 и 2 имеют один и тот же граф и обратно.
Лемма. Если 1Þ3,4 2, то D( 1)=D( 2)
Определение. Блок = (P, I, V) называется открытым если
1)ни один из операторов Р не имеет вид А¬a где АÎI,
2)в Р нет двух операторов, присваивающих значение одной и той же переменной.
Воткрытом блоке =(P, I, U) все операторы Si из Р присваивают значения переменным Xi, не входящим в I. Открытый блок всегда можно получить с помощью только преобразований Т3.
Лемма. Пусть =(P, I, U)- блок. Тогда существует такой эквива-
лентный открытый блок ¢=(P¢,I¢,U¢), что Û3 ¢
*
Теорема. D( 1) = D( 2) тогда и только тогда, когда 1 Û 2
3,4
Т.е. два блока имеют один и тот же граф тогда и только тогда, когда их можно преобразовать в один в другой переименованием и перестановкой.
Следствие. Если D( 1) = D( 2), то 1 º 2.
Пример. Рассмотрим два блока 1 = {P1, {A, B}, {F}} и 1 = {P2, {A, B}, {F}}, множества Р1 и Р2 для них приведены в табл. 11.1.
Таблица 11.1.
|
Р1 |
|
Р2 |
|
|
|
|
|
|
|
|
|
C¬A*A |
|
C¬B*B |
|
|
|
D¬B*B |
|
D¬A*A |
||
|
E¬C-D |
|
E¬D+C |
||
|
F¬C+D |
|
C¬D-C |
||
|
F¬E/F |
|
C¬C/E |
|
|
|
Блоки 1 и 2 |
имеют один и тот же граф, изображенный на рис. |
|||
11.2. |
|
|
|
|
С помощью преобразования Т3 можно отобразить 1 и 2 в откры-
тые блоки ¢1=(P¢1,{A, B},{X5}) и ¢2=(P¢2,{A, B},{X5}) (табл. 11.2).

|
110 |
|
/ |
- |
+ |
* |
* |
A |
B |
Рис. 11.2. Граф для 1 и 2.
Таблица 11.2.
Р¢1 |
Р¢2 |
|
|
X1¬A*A |
X2¬B*B |
X2¬B*B |
X1¬A*A |
X3¬X1-X2 |
X4¬X1+X2 |
X4¬X1+X2 |
X3¬X1-X2 |
X5¬X3/X4 |
X5¬X3/X4 |
|
|
А с помощью оператора перестановки привести и сделать полностью эквивалентными
6.1.4.Критерий эквивалентности блоков
Определение. Блок называется приведенный, если не существует
такой блок ¢,что Þ1, 2 ¢ Приведенный блок не содержит ни бесполезных операторов, ни из-
быточных вычислений