Для этого вам потребуется система Program Transformation , такая как DMS Software Reengineering Toolkit и ее C ++ Front End .
DMS анализирует код в AST, позволяет выполнять различные анализы, может применять преобразования источника в источник, обусловленные анализами, и может восстанавливать исходный код из преобразованных AST.
В одномиз комментариев Роб Сез:
Я бы согласился на инструмент, который заменяет на (T :: iterator it = c.begin (); it
Это довольно легко написать с помощью DMS:
rule robs_rule(T:IDENTIFIER, it:IDENTIFIER,
c:IDENTIFIER, x: IDENTIFIER)
:statement->statement
= " for(\T::iterator \it = \c.begin(); \it < \c.end(); ++\it) \x(*\it)"
=> "for(auto& \t : \c) \x(\t)";
Хотя правило выглядит текстовым, на самом деле это описание переписывания AST в AST;он анализируется с помощью внешнего интерфейса DMS C ++.Следовательно, совпадения надежны и не основаны на взломе строк.(Тот факт, что \ c встречается дважды в шаблоне, заставляет оба быть идентичными.)
На практике вы захотите использовать множество правил для рассмотрения интересующего вас случая, и вы, вероятно, захотитеобобщать их больше, например, применяя * \ it => \ it в дополнительном отчете.Также будет полезно использовать различные виды анализа потоков для поддержки преобразований.На этом этапе DMS предлагает анализ потока управления, но еще не анализ потока данных для C ++.
В настоящее время такие виды задач возможны, но их не обязательно легко написать с помощью DMS.Он был использован для масштабного изменения архитектуры C ++;проверьте библиографию на веб-сайте.