Восстановление текстов программ по преобразованному синтаксическому дереву Выполнил: Юрий Литвинов, 545гр. Научный руководитель: Дмитрий Копаев
Введение Одна из задач реинжиниринга – преобразование программ к виду, пригодному для сопровождения После различных преобразований над программой (удаление мёртвого кода, реструктуризация) необходимо породить текстовое представление Результат генерации должен выглядеть, как правка исходной программы
Постановка задачи Порождённый текст должен содержать возможно больше промежутков, скопированных из исходного файла Текст, порождённый по дереву, должен естественным образом вписываться в неизменённый текст Алгоритм должен накладывать возможно меньшие ограничения на входное дерево
Обзор предыдущего решения Принцип работы основного прохода заключался в обходе дерева в глубину и печати текста узла следующим образом: Печатается текст от начала узла до начала первого сына Печатается текст сына Печатается текст между сыновьями Печатается текст от конца последнего сына до конца узла Недостатки: должен быть известен порядок сыновей, требует соответствия структуры дерева структуре исходного файла 01 A PIC X OCCURS A PIC X OCCURS 20.
Трудные ситуации 1 Простейший пример: удаление сына f(a, b, c) Пусть в результате преобразования один из параметров функции был удалён. Если просто удалить его текст, получим f(a,, c) Требуется перегенерация всего узла по дереву, при этом сыновья могут быть сгенерированы по привязке
Трудные ситуации 2 Неизвестный порядок сыновей Синтаксические элементы в тексте могут идти в произвольном порядке, тогда как порядок узлов в дереве фиксирован 01 A PIC X OCCURS 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 A PIC X OCCURS 20.
Преимущества предлагаемого подхода Порядок узлов в дереве не имеет значения Возможно порождение элементов текста, не являющихся частью синтаксиса программы Для алгоритма не важна вложенность и непрерывность привязок
Заключение Предлагаемый алгоритм реализован и используется для генерации текстов программ на языках COBOL и RPG в системе Modernization Workbench Алгоритм позволяет генерировать по привязке больше промежутков, чем предыдущий алгоритм, и при этом накладывает меньшие ограничения на дерево Реализация позволяет поддерживать новые языки, описывая только синтаксические правила и некоторые особенности языка