Saltar al contenido

¿Eliminar los comentarios de C y C++ usando Python?

Nuestro equipo de especialistas pasados muchos días de investigación y recopilación de de datos, dimos con los datos necesarios, queremos que todo este artículo sea de utilidad para tu trabajo.

Solución:

Esto maneja comentarios de estilo C ++, comentarios de estilo C, cadenas y anidamiento simple de los mismos.

def comment_remover(text):
    def replacer(match):
        s = match.group(0)
        if s.startswith('/'):
            return " " # note: a space and not an empty string
        else:
            return s
    pattern = re.compile(
        r'//.*?$|/*.*?*/|'(?:\.|[^\'])*'|"(?:\.|[^\"])*"',
        re.DOTALL | re.MULTILINE
    )
    return re.sub(pattern, replacer, text)

Las cadenas deben incluirse, porque los marcadores de comentarios dentro de ellas no inician un comentario.

Editar: re.sub no tomó ninguna bandera, por lo que primero tuvo que compilar el patrón.

Edit2: Se agregaron caracteres literales, ya que podrían contener comillas que de otro modo se reconocerían como string delimitadores

Edit3: Se corrigió el caso donde una expresión legal int/**/x=5; se convertiría intx=5; que no compilaría, reemplazando el comentario con un espacio en lugar de un vacío string.

Los comentarios de C (y C++) no se pueden anidar. Las expresiones regulares funcionan bien:

//.*?n|/*.*?*/

Esto requiere el indicador de “Línea única” (Re.S) porque un comentario C puede abarcar varias líneas.

def stripcomments(text):
    return re.sub('//.*?n|/*.*?*/', '', text, flags=re.S)

Este código debería funcionar.

/EDITAR: ¡Observe que mi código anterior en realidad hace una suposición sobre los finales de línea! Este código no funcionará en un archivo de texto de Mac. Sin embargo, esto se puede modificar con relativa facilidad:

//.*?(rn?|n)|/*.*?*/

Esta expresión regular debería funcionar en todos los archivos de texto, independientemente de sus finales de línea (cubre los finales de línea de Windows, Unix y Mac).

/EDITAR: MizardX y Brian (en los comentarios) hicieron un comentario válido sobre el manejo de cadenas. Me olvidé por completo de eso porque la expresión regular anterior se extrae de un módulo de análisis que tiene un manejo adicional para cadenas. La solución de MizardX debería funcionar muy bien, pero solo maneja cadenas entre comillas dobles.

No olvide que en C, backslash-newline se elimina antes de que se procesen los comentarios, y los trigraphs se procesan antes (porque ??/ es el trigraph para backslash). Tengo un programa en C llamado SCC (strip C/C++ comments), y aquí hay parte del código de prueba…

" */ /* SCC has been trained to know about strings /* */ */"!
""Double quotes embedded in strings, \" too'!"
"And 
newlines in them"

"And escaped double quotes at the end of a string""

aa '\
n' OK
aa """
aa "
n"

This is followed by C++/C99 comment number 1.
// C++/C99 comment with 
continuation character 
on three source lines (this should not be seen with the -C fla
The C++/C99 comment number 1 has finished.

This is followed by C++/C99 comment number 2.
/
/
C++/C99 comment (this should not be seen with the -C flag)
The C++/C99 comment number 2 has finished.

This is followed by regular C comment number 1.
/
*
Regular
comment
*
/
The regular C comment number 1 has finished.

/
/ This is not a C++/C99 comment!

This is followed by C++/C99 comment number 3.
/


/ But this is a C++/C99 comment!
The C++/C99 comment number 3 has finished.

/
* This is not a C or C++  comment!

This is followed by regular C comment number 2.
/
*/ This is a regular C comment *
but this is just a routine continuation *
and that was not the end either - but this is *

/
The regular C comment number 2 has finished.

This is followed by regular C comment number 3.
/



* C comment */

Esto no ilustra los trigrafos. Tenga en cuenta que puede tener múltiples barras invertidas al final de una línea, pero al empalme de línea no le importa cuántos hay, pero el procesamiento posterior sí. Etc. Escribir una sola expresión regular para manejar todos estos casos no será trivial (pero eso es diferente de imposible).

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *