Есть ли инструмент, который переписывает циклы for C ++ в stl-алгоритмы? - PullRequest
4 голосов
/ 25 января 2012

В C # Resharper удается переписать циклы старой школы для LINQ выражений.Есть ли какой-нибудь инструмент, который может сделать то же самое в C ++, с той разницей, что он переписывает циклы for для использования stl-алгоритмов, где это возможно?

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Для этого вам потребуется система 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 ++;проверьте библиографию на веб-сайте.

1 голос
/ 28 января 2012

Ну, может быть, такого инструмента нет (пока).А пока вы можете взглянуть на cppcheck .Это инструмент для статического анализа кода.Он неплохо справляется с общей задачей, но также позволяет вам определять свой собственный набор правил.Это может приблизить вас к решению C # Resharper.

...