
- •Глава 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. Трансляция переменных.
5.3. Атрибутные грамматики
Среди всех формальных методов описания языков программирования
атрибутные грамматики получили, по-видимому, наибольшую известность и
распространение. Причиной этого является то, что формализм атрибутных
грамматик основывается на дереве разбора программы в КС-грамматике,
что сближает его с хорошо разработанной теорией и практикой построения
трансляторов.
5.3.1. Определение атрибутных грамматик
Пусть G - КС-грамматика: G=(T,N,P,Z), где T, N, P, Z, -
соответственно, множество терминальных символов, нетерминальных
символов, множество правил вывода и аксиома грамматики. Правила вывода
КС-грамматики будем записывать в виде
p: X0 -> X1 ... Xn
и будем предполагать, что G - редуцированная КС-грамматика, т.е.
в ней нет нетерминальных символов, для которых не существует полного
дерева вывода , в которое входит этот нетерминал.
С каждым символом X <- N U T свяжем множество A(X) атрибутов
символа X.Некоторые из множеств A(x) могут быть пусты. Запись a(X)
означает, что a <- A(X).
С каждым правилом вывода p <- P свяжем множество F
семантических правил, имеющих следующую форму:
a0 = fpa0(a1, ... , aj),
где ik <- [0,np] - номер символа правила p, а ak - атрибут
символа Xik , т.е. ak <- A(Xik).
В таком случае будем говорить , что a0 "зависит" от a1,...,aj или
что a0 "вычисляется по" a1,...,aj. В частном случае j может быть равно
нулю, тогда будем говорить, что атрибут a0 "получает в качестве
значения константу".
КС-грамматику, каждому символу которой сопоставлено множество
атрибутов, а каждому правилу вывода - множество семантических правил,
будем называть атрибутной грамматикой (AG).
Назовем атрибут a(X0) синтезируемым, если одному из правил вывода
p: X0 ->X1 ... Xnp сопоставлено семантическое правило a<0>=fa<0>(...).
Назовем атрибут a(Xi) наследуемым, если одному из правил вывода p:X0
-> X1 ... Xi ... Xnp сопоставлено семантическое правило a=fa(...), i
<- [1,np]. Множество синтезируемых атрибутов символа X обозначим через
S(X), наследуемых атрибутов - через I(X).
Будем считать, что значение атрибутов терминальных символов -
константы, т.е. их значения определены, но для них нет семантических
правил, определеяющих их значения.
5.3.2. Атрибутированное дерево разбора
Если дана атрибутная грамматика AG и цепочка, принадлежащая
языку, определяемому G, то можно построить дерево разбора этой цепочки
в грамматике G. В этом дереве каждая вершина помечена символом
грамматики G. Припишем теперь каждой вершине множество атрибутов,
сопоставленных символу, которым помечена эта вершина. Атрибуты,
сопоставленные вхождениям символов в дерево разбора, будем называть
вхождениями атрибутов в дерево разбора, а дерево с сопоставленными
каждой вершине атрибутами - атрибутированным деревом разбора.
Между вхождениями атрибутов в дерево разбора существуют
зависимости, определяемые семантическими правилами, соответствующими
примененным синтаксическим правилам.