Инструментарий реинжиниринга программного обеспечения DMS может сделать это путем применения программных преобразований.
Конкретное преобразование 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).