El DMS Software Reengineering Toolkit puede hacerlo, mediante la aplicación de transformaciones de programa.
una transformación específica DMS para que coincida con su ejemplo específico:
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 ; ".
Se necesitaría otra regla para manejar su otro caso, pero es igualmente fácil de expresar.
Las transformaciones operan en estructuras de código fuente en lugar de texto, por lo que la distribución y los comentarios no afectarán el reconocimiento o la aplicación. Las comillas en la regla no son comillas de cadena tradicionales, sino que son citas metalingüísticas que separan el lenguaje de sintaxis de la regla de la languidez del patrón utilizada para especificar la sintaxis concreta que se va a cambiar.
Existen algunos problemas con las directivas de preprocesamiento si tiene la intención de conservarlos. Como aparentemente está dispuesto a trabajar con código expandido por preprocesador, puede solicitar a DMS que realice el preprocesamiento como parte del paso de transformación; tiene preprocesadores compatibles con GCC4 y GCC4 integrados.
Como han observado otros, este es un caso bastante fácil porque lo especificó funciona en el nivel de una declaración completa. Si desea eliminar el código de cualquier tarea que se parece a esta declaración, con tales asignaciones incrustadas en varios contextos (inicializadores, etc.) puede necesitar un conjunto más grande de transformaciones para manejar el conjunto de casos especiales, y puede necesidad de fabricar otras estructuras de código (por ejemplo, variables temp del tipo apropiado). Lo bueno de una herramienta como DMS es que puede calcular explícitamente un tipo simbólico para una expresión arbitraria (por lo tanto, la declaración de tipo de cualquier temperatura necesaria) y que puede escribir un conjunto más grande de forma bastante sencilla y aplicarlos todos.
Dicho todo esto, no estoy seguro del valor real de realizar su operación de eliminación de expresiones condicionales ternarias. Una vez que el compilador obtiene el resultado, puede obtener un código de objeto similar como si no hubiera realizado las transformaciones. Después de todo, el compilador también puede aplicar transformaciones que preservan la equivalencia.
Obviamente, es valioso hacer cambios regulares en general.
(DMS puede aplicar transformaciones de programa fuente a fuente a muchos lenguajes, incluidos C, C++, Java, C# y PHP).
¡Esto grita "macro impresionante, incompleto!" a mi. –
¿Es solo un archivo? Si es así, quizás puedas hacerlo con una expresión regular sofisticada y la función de búsqueda y reemplazo de un editor que puede hacer esto. –
¿Por qué? Debería considerar que hay situaciones en las que no hay equivalente semántico. No hay nada malo con el operador ternario. – GManNickG