
- •Глава 1. Введение 2
- •Глава 2. Лексический анализ 6
- •2.4. Построение детерминированного конечного
- •Глава 3. Синтаксический анализ 20
- •Глава 8. Генерация кода 76
- •Глава 9. Системы автоматизации построения трансляторов 120
- •Глава 1. Введение
- •1.1. Место компилятора в программном обеспечении
- •1.2. Структура компилятора
- •Глава 2. Лексический анализ
- •2.1. Регулярные множества и регулярные выражения
- •2.2. Конечные автоматы
- •2.5. Программирование лексических анализаторов
- •2.6. Конструктор лексических анализаторов lex
- •Глава 3. Синтаксический анализ
- •3.1. Основные понятия и определения
- •3.2. Таблично-управляемый предсказывающий разбор
- •3.2.1. Алгоритм разбора сверху-вниз
- •3.2.2. Множества first и follow.
- •3.2.4. Ll(1)-грамматики
- •3.2.5. Удаление левой рекурсии
- •3.2.6. Левая факторизация
- •3.2.7. Рекурсивный спуск
- •3.2.8. Диаграммы переходов для рекурсивного спуска
- •3.2.9. Восстановление после синтаксических ошибок
- •3.3. Разбор снизу-вверх типа сдвиг-свертка
- •3.3.1. Основа
- •3.3.2. Lr(k)-анализаторы
- •3.3.4. Конфликты разбора типа сдвиг-свертка
- •3.3.5. Восстановление после синтаксических ошибок
- •Глава 4. Промежуточные представления программы
- •4.1. Представление в виде ориентированного графа
- •4.2. Трехадресный код
- •4.3. Линеаризованные представления
- •4.4. Организация информации в генераторе кода
- •4.5. Уровень промежуточного представления
- •Глава 5. Элементы теории перевода
- •5.1. Преобразователи с магазинной памятью
- •5.2. Синтаксически управляемый перевод
- •5.3. Атрибутные грамматики
- •5.3.1. Определение атрибутных грамматик
- •5.3.2. Атрибутированное дерево разбора
- •5.3.3. Язык описания атрибутных грамматик
- •Глава 6. Контекстные условия языков программирования
- •6.1. Описание областей видимости и блочной структуры
- •6.2. Структура среды Модулы-2
- •6.3. Занесение в среду и поиск объектов
- •Глава 7. Организация таблиц символов компилятора
- •7.1. Таблицы идентификаторов и таблицы символов
- •7.2. Таблицы идентификаторов
- •7.3. Таблицы символов и таблицы расстановки
- •7.4. Функции расстановки.
- •7.5. Таблицы на деревьях
- •7.7. Сравнение различных методов реализации таблиц
- •Глава 8. Генерация кода
- •8.1. Модель машины
- •8.2. Динамическая организация памяти
- •8.3. Назначение адресов
- •8.4. Трансляция переменных.
3.2.8. Диаграммы переходов для рекурсивного спуска
Как правило, непосредственное программирование рекурсивного
спуска из грамматики приводит к большому числу процедур. Число этих
процедур можно уменьшить, заменив в некоторых правилах рекурсию
циклом. Для этого можно воспользоваться диаграммой переходов
грамматики, которая строится следующим образом.
Пусть имеется LL(1)-грамматика. Тогда для каждого нетерминала
построение диаграммы включает следующие шаги.
Шаг 1. Вводим начальное и заключительное состояния.
Шаг 2. Для каждого правила вывода A->X1X2...Xn строим путь из
начального в конечное состояние с дугами, помеченными X1,...,Xn. Если
анализатор, построенный по диаграмме переходов, оказывается в
состоянии s и дуга, помеченная терминалом a, ведет в состояние t, то
если очередной входной символ равен a, анализатор продвигает вход на
одну позицию вправо и переходит в состояние t. Если же дуга помечена
нетерминалом A, анализатор входит в начальное состояние для A без
продвижения входа. После того как он достигает заключительного
состояния для A, он переходит в состояние t, что означает "чтение" A
из входа при переходе из состояния s в состояние t. Наконец, если есть
дуга из s в t, помеченная e, то анализатор переходит из s в t, не
читая входа. Если следовать программе рекурсивного спуска, то переход
по e должен всегда выбираться в качестве последней альтернативы.
Диаграммы переходов могут быть упрощены подстановкой одной в другую.
Рассмотрим, например, диаграммы для арифметических выражений на рис.
3.10.
+---+ T +---+ E'+-----+ +---+ + +---+ T +---+ E'+-----+
E:| 0 |-->| 1 |-->|| 2 ||E':| 3 |-->| 4 |-->| 5 |-->|| 6 ||
+---+ +---+ +-----+ +---+ +---+ +---+ +-----+
| ^
| e |
+------------------------+
+---+ T +---+ E'+-----+ +----+ + +----+ T +----+ E'+----+
E:| 7 |-->| 8 |-->|| 9 ||E':| 10 |-->| 11 |-->| 12 |-->||13||
+---+ +---+ +-----+ +----+ +----+ +----+ +----+
| ^
| e |
+---------------------------+
51
+----+ ( +----+ E +----+ ) +------+
F: | 14 |---->| 15 |---->| 16 |---->|| 17 ||
+----+ +----+ +----+ +------+
| ^
| id |
+---------------------------------+
Рис. 3.10
e
+---------------------+ +---------+
| | | T |
v | v |
+---+ + +---+ T +-----+ +---+ + +---+
E': | 3 |----->| 4 |---->|| 5 || => E':| 3 |---->| 4 |
+---+ +---+ +-----+ +---+ +---+
|e |e
| +-----+ | +-----+
+-------->|| 6 || +----->|| 6 ||
+-----+ +-----+
+-------+ +---------+
| T | | + |
v | v | e
+---+ T +---+ + +---+ +---+ T +---+ +-----+
E: | 0 |-->| 3 |-->| 4 | => E: | 0 |---->| 3 |-->|| 6 ||
+---+ +---+ +---+ +---+ +---+ +-----+
| e +-----+
+--->|| 6 ||
+-----+
Рис. 3.11
+---------+ +---------+
| + | | * |
v | e v | e
+---+ T +---+ +-----+ +---+ F +---+ +------+
E: | 0 |---->| 3 |---->|| 6 || T: | 7 |---->| 8 |--->|| 13 ||
+---+ +---+ +-----+ +---+ +---+ +------+
+----+ ( +----+ E +----+ ) +------+
F: | 14 |---->| 15 |---->| 16 |---->|| 17 ||
+----+ +----+ +----+ +------+
| ^
| e |
+---------------------------------+
Рис. 3.12
На рис 3.11 приведена эквивалентная диаграмма переходов для E'.
Можно подставить диаграмму для E' рис.3.11 в диаграмму для E рис.
3.10. Получится диаграмма рис. 3.11 для E. Наконец, видно, что в этой
диаграмме нулевая и четвертая вершины эквивалентны и их можно слить.
Так же можно поступить с диаграммами для T и T'. В результате
получится набор диаграмм рис. 3.12.
Такое преобразование эквивалентно описанию грамматики
расширенными формулами Бэкуса-Наура, в которых помимо собственно
рекурсивных определений допускаются описания повторений. При
программировании рекурсивного спуска такая диаграмма для E
записывается очевидным образом:
procedure E; repeat T; until InSym<>PLUS;