Восстановление текстов программ по преобразованному

advertisement
Восстановление текстов
программ по преобразованному
синтаксическому дереву
Выполнил: Юрий Литвинов, 545гр.
Научный руководитель: Дмитрий Копаев
Введение



Одна из задач реинжиниринга –
преобразование программ к виду,
пригодному для сопровождения
После различных преобразований над
программой (удаление мёртвого кода,
реструктуризация) необходимо породить
текстовое представление
Результат генерации должен выглядеть,
как правка исходной программы
Постановка задачи



Порождённый текст должен содержать
возможно больше промежутков,
скопированных из исходного файла
Текст, порождённый по дереву, должен
естественным образом вписываться в
неизменённый текст
Алгоритм должен накладывать возможно
меньшие ограничения на входное дерево
Обзор предыдущего решения

Принцип работы основного прохода
заключался в обходе дерева в глубину и
печати текста узла следующим образом:





Печатается текст от начала узла до
начала первого сына
Печатается текст сына
Печатается текст между сыновьями
Печатается текст от конца последнего
сына до конца узла
Недостатки: должен быть известен
порядок сыновей, требует соответствия
структуры дерева структуре исходного
файла
01 A PIC X OCCURS 10.
01 A PIC X OCCURS 10.
01 A PIC X OCCURS 20.
Трудные ситуации 1

Простейший пример: удаление сына
f(a, b, c)
Пусть в результате преобразования один из
параметров функции был удалён. Если просто
удалить его текст, получим
f(a, , c)
Требуется перегенерация всего узла по дереву, при
этом сыновья могут быть сгенерированы по привязке
Трудные ситуации 2

Неизвестный порядок сыновей
Синтаксические элементы в тексте могут идти в
произвольном порядке, тогда как порядок узлов в
дереве фиксирован
01 A PIC X OCCURS 10.
01 A OCCURS 10 PIC X.
При генерации сыновей в порядке, в котором они
входили в дерево, порождается неверный текст:
 01 A OCCURS 10 PIC X 10 PIC X.
Трудные ситуации 3

Несинтаксические элементы
Некоторые элементы текста программы отсутствуют в дереве:
01 A PIC X.
EJECT
01 B PIC X.
01 C PIC X.
Положим, 01 B PIC X. удалили. Получим
01 A PIC X.
01 C PIC X.
Должны получить
01 A PIC X.
EJECT
01 C PIC X.
Идеи предлагаемого алгоритма




Для каждого узла определяется его
прообраз в тексте
Полученные промежутки
сортируются по привязке
Промежутки с неизвестной
привязкой вставляются в порядке,
определяемом синтаксическими
правилами и расположением
привязанных промежутков
Над цепочками промежутков могут
выполняться дополнительные
преобразования (разбиение по
строкам, анализ копибуков и т.д.)
01 A PIC X OCCURS 10.
01 A PIC X OCCURS 20.
Преимущества предлагаемого подхода



Порядок узлов в дереве не имеет
значения
Возможно порождение элементов текста,
не являющихся частью синтаксиса
программы
Для алгоритма не важна вложенность и
непрерывность привязок
Заключение



Предлагаемый алгоритм реализован и
используется для генерации текстов программ на
языках COBOL и RPG в системе Modernization
Workbench
Алгоритм позволяет генерировать по привязке
больше промежутков, чем предыдущий
алгоритм, и при этом накладывает меньшие
ограничения на дерево
Реализация позволяет поддерживать новые
языки, описывая только синтаксические правила
и некоторые особенности языка
Download