Что вас интересует, так это "источник-источник" системы преобразования программ .
Парсер необходим, но вряд ли достаточен. (Фактически, парсер для вашего диалекта языка, который вы используете, необходим ... учитывая, что люди используют так много языков "программирования", это много парсеров, необходимых). Вам также необходимо захватить результат анализа (как правило, в виде дерева), иметь возможность каким-либо образом манипулировать этим деревом, а затем восстановить действительный исходный код из дерева. Если вы хотите, чтобы этот исходный код был постоянным изменением исходного кода, запрограммированного вручную, комбинация синтаксический анализатор / дерево / unparser должна сохранять форматирование кода и комментарии в максимально возможной степени.
Зачастую вы не можете реально преобразовать код, если значение идентификаторов не ясно; поэтому на практике вам нужно не только анализировать, но и создавать таблицы символов (на данный момент у вас есть то, что составляет внешний интерфейс компилятора, а не анализатор). Многие преобразования требуют отслеживания информационных потоков (поток управления, поток данных, точки, кто звонит, ...). Без этих функций эти инструменты не очень эффективны для процедурных / OO-языков, которые составляют большую часть исходного кода. (Ребята с функциональными языками могут обойтись с меньшим анализом потока, потому что все является выражением, но большая часть написанного кода не является функциональной, так что это не имеет значения в практическом смысле).
Существует несколько систем преобразования источника в источник, некоторые из которых зависят от языка (например, JackPot для Java); некоторые из них параметризованы определениями языка (TXL, Stratego, DMS).
Некоторые из языков, специфичных для языка, содержат таблицы символов и анализ потока. Я знаю только одно преобразование, которое предоставляет эти возможности для ряда языков программирования, и это наш набор инструментов для реинжиниринга программного обеспечения DMS .
DMS предоставляет это для ряда реальных языков программирования и их общих диалектов, а не для игрушек: C, Java, COBOL.
DMS - одна из немногих систем преобразования исходного кода в C ++; он использовался в гневе для внесения изменений в большие программы на C ++. Clang довольно близко, я думаю, конечно, в амбициях; Компилятор Rose - это другой, используемый в основном в суперкомпьютерных кругах, но оба они специфичны для C ++ (возможно, с добавленным C).