DMS Software Reengineering Toolkit может это сделать, применяя программные преобразования.
Конкретного преобразование DMS, чтобы соответствовать вашему конкретному примеру:
domain C.
rule ifthenelseize_conditional_expression(a:lvalue,A:condition,B:term,C:term):
stmt -> stmt
= " \a = \A ? \B : \C; "
-> " if (\A) \a = \B; else \a=\C ; ".
Вам потребуется еще одно правило для обработки вашего другого случая, но столь же легко выразить.
Преобразования работают с структурами исходного кода, а не с текстом, поэтому компоновка и комментарии не будут влиять на распознавание или применение. Кавычки в правиле не являются традиционными строковыми кавычками, а скорее являются металингвистическими кавычками, которые отделяют язык синтаксиса правила от стиля языка, используемого для указания конкретного синтаксиса, который нужно изменить.
Есть некоторые проблемы с директивами предварительной обработки, если вы намерены их сохранить. Поскольку вы готовы работать с препроцессорным расширенным кодом, вы можете попросить DMS выполнить предварительную обработку как часть шага преобразования; он имеет полные совместимые с GCC4 и GCC4 препроцессоры, построенные прямо.
Как и другие, это довольно простой случай, поскольку вы указали, что он работает на уровне полного утверждения. Если вы хотите избавиться от кода любого присваивания, похожего на этот оператор, с такими назначениями, встроенными в различные контексты (инициализаторы и т. Д.), Вам может понадобиться больший набор преобразований для обработки различных наборов специальных случаев, и вы можете необходимо создать другие структуры кода (например, временные переменные соответствующего типа). Хорошая вещь о инструменте, таком как DMS, заключается в том, что он может явно вычислить символический тип для произвольного выражения (таким образом, объявление типа любых необходимых темпов) и что вы можете написать такой большой набор довольно прямо и применить все их.
Все, что сказал, я не уверен в реальной стоимости выполнения операции исключения термально-условного выражения. Как только компилятор получит результат, вы можете получить аналогичный объектный код, как будто вы вообще не делали преобразований. В конце концов, компилятор также может применять преобразования, сохраняющие эквивалентность.
Очевидно, что есть смысл делать обычные изменения в целом.
(DMS может применять преобразования программ источника к источнику для многих языков, включая C, C++, Java, C# и PHP).
Это кричит «потрясающий, отрывочный макрос!». мне. –
Это только один файл? Если это возможно, вы можете сделать это со сложным регулярным выражением и функцией замены поиска редактора, который может это сделать. –
Почему? Вы должны учитывать, что существуют ситуации, когда семантический эквивалент отсутствует. Нет ничего плохого в тернарном операторе. – GManNickG