Опубликован: 23.07.2006 | Доступ: свободный | Студентов: 2215 / 889 | Оценка: 4.28 / 4.17 | Длительность: 21:37:00
Специальности: Системный архитектор
Лекция 15:

Выбор инструкций при генерации кода

Динамическое программирование (продолжение)


Условия соответствия поддерева образцу остались прежними, но теперь функция Match заодно считает стоимость вывода поддерева из образца, суммируя стоимость собственно правила и стоимости минимальных выводов поддеревьев из нужных для соответствия образцу нетерминалов.

Построение замыкания по цепным правилам также аналогично обычному замыканию в деревянных грамматиках, однако здесь замыкание выводит нетерминал только в том случае, когда вывод по этому правилу доставляет минимальную стоимость.

Динамическое программирование (окончание)


Можно доказать, что приведенный алгоритм действительно строит разметку, обладающую заявленными свойствами. Его сложность также пропорциональна произведению числа правил на количество вершин дерева.

Отсюда следует, что если дерево выводимо в данной грамматике, то разметка сопоставляет паре (корень дерева, стартовый нетерминал) стоимость минимального вывода и правило, которое этот вывод начинает.

Пример

В качестве примера рассмотрим грамматику, приведенную на иллюстрации. Здесь в квадратных скобках указаны стоимости правил, в круглых - их номера.

Неформально говоря данная грамматика используется для выбора команд для дерева выражения, состоящего из констант ( const ), переменных ( loc ), бинарного сложения (' + '), присваивания (' = ') и косвенной адресации ( fetch ).

Нетерминалы грамматики имеют следующий смысл: Imm - непосредственный операнд, Reg - регистр, Addr - адрес в памяти, Void - стартовый нетерминал. Таким образом, мы видим, что язык, определяемый грамматикой, действительно описывает внутреннее представление программы, а нетерминалы и правила машиннозависимы и отражают систему команд и элементы архитектуры устройства.

Разметка дерева в соответствии с этой грамматикой приведена в правой части иллюстрации. Здесь также в квадратных скобках указана стоимость минимального вывода для данного нетерминала, в круглых скобках - номер правила, доставляющего минимальный вывод.