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などの多くの言語に適用できます)。