Formateador de código fuente C++

Estoy codificando una herramienta para analizar el código C++. No quiero terminar codificando la mitad de un compilador. Aunque soy consciente de Clang , eso es demasiado para mis propósitos.

Estaba analizando a mano, pero me he encontrado con demasiados estilos de codificación.

Busco una herramienta que analice el código C++, con un solo factor importante:

Debe poder poner toda la declaración de la función en una sola línea.

Entonces, cosas como

unsigned
int
myclass::
myfunc
(int x;
int y)
{
}

y todas sus muchas variaciones, deben convertirse

unsigned int myclass::myfunc(int x; int y)
{
}

Eso es todo lo que necesito para este proyecto en particular: la capacidad de encontrar cada función en un archivo y obtener su tipo de devolución.

Bueno si es Linux, pero puedo vivir con Windows.

La GUI sería buena, con la vista previa como una ventaja.

El modo por lotes sería bueno, incluida la capacidad de procesar recursivamente un directorio determinado.

Pero ninguno de esos bonitos son obligatorios, solo los single line for the function declaration requirement is.

Puede usar Visual Studio Community Edition, que es gratuito. Es compatible con C ++ y el formato del código es muy bueno y también se puede personalizar hasta cierto punto para adaptarse a sus gustos.
Pero, ¿es compatible con mi único requisito?
Parcialmente. Reemplace todo \npor [space], CTRL+A, CTRL+K luego CTRL+F para formatear, luego reemplace todo {por \n{y reemplace todo }por \n}esto se puede programar para revisar todos los archivos.
Community Edition también tiene una versión web que ejecuta una página web, por lo que es compatible con prácticamente cualquier sistema operativo.
@Franck, ¿tienes una URL para eso?
aquí la página web principal. En la esquina inferior derecha, puede registrarse para obtener 5 licencias básicas gratuitas. todo el código guardado con Git para que haya un control de fuente integrado
"Busco una herramienta que analice el código C++, con un solo factor importante: debe poder poner toda la declaración de la función en una sola línea". Esto no es un analizador. Tal vez esté buscando un analizador de C ++ que pueda usar para construir una impresora bonita. Pero eso no es lo que dice su título. Luego dices, "necesitas encontrar cada función y obtener su tipo de retorno". Entonces, ¿qué es lo que quieres? Si realmente desea el tipo de retorno, también necesitará preprocesamiento y tablas de símbolos. Esta solicitud de SR está muy mal escrita.
@Mawg: ... Entonces, ¿qué quieres decir con "quieres el tipo de retorno"? ¿Quiere solo la cadena de caracteres utilizada para declarar el tipo, o algo más profundo? Si el encabezado de la función es "int foo(...)", entonces el tipo de retorno es obviamente "int". ¿Cuál es el tipo de retorno para "T foo(...)"; ¿Es "T", o el typedef detrás de T? ¿Qué tal "A:B:C:T foo(...)"? ¿Qué sucede si el tipo de devolución es una invocación de plantilla? ¿Una macrollamada? Implica un prepreprocesador condicional?
¡Guau! Esa es una pregunta difícil. No hay plantillas en nuestro código, por lo que un tipo de retorno simple sería suficiente. Pero ese es un muy buen punto. Parece que tendré que terminar codificando la mitad de un compilador :-(
@Mawg: no respondió la pregunta sobre qué desea para el tipo de devolución. También podría ayudar si nos dijera qué iba a hacer con el resultado. Sin una respuesta, no es posible para el resto de nosotros juzgar la utilidad de ninguna respuesta (por ejemplo, "astyle" o gnu indent).
He estado en un nuevo trabajo desde hace algún tiempo, por lo que la pregunta es solo de interés histórico. IIRC, quería analizar el código y generar fragmentos de código para usarlos en pruebas unitarias. Para las funciones escritas, quería agregar una declaración de retorno, para mantener contento al compilador. Sin embargo, nunca voy tan lejos, ya que podría encontrar un analizador que pudiera manejar el código.

Respuestas (3)

http://astyle.sourceforge.net/

aStyle - sin competencia. He estado usando esto por un tiempo ya que tiendo a escribir funciones en el bloc de notas ++ en mi camino al trabajo y luego embellecerlo con esto antes de incluirlo en proyectos; en mi opinión, realmente hace un gran trabajo.

¿Es compatible con mi único requisito? ¿Si es así, cómo?
Seis meses y ninguna evidencia de que esto respalde el requisito de OP. Downvoting como "no es una respuesta de alta calidad".

GNU Indent puede manejar esto:

indent b.c

Aporte:

unsigned
int
myfunc
(int x;
int y)
{
}

Producción:

unsigned int myfunc (int x; int y)
{
}

No quiero terminar codificando la mitad de un compilador

No es tan complicado para la característica que está solicitando. Aquí hay un script de Perl para comenzar.

Las matrices keywords_nospacey keywords_spacecontienen las palabras/caracteres al final de las líneas que desea combinar. El primero es para combinar sin espacios y el segundo agrega espacios.

use strict;
use warnings;

open(my $in, "<", $ARGV[0]) or die "Can't open file: $!";
open(my $out, ">", "restructured_$ARGV[0]");

my $word;
my @keywords_nospace = ("::","myfunc");
my @keywords_space = ("unsigned","int",";");

while (<$in>) {
   for $word (@keywords_nospace) {chomp if (/\Q$word\E$/i);} # removes trailing spaces and newline
   for $word (@keywords_space)
     {
       if (/\Q$word\E$/i)
     {
       chomp; # Removes trailing spaces and newline
       $_ = "$_ "; # Add a space at the end of the line
     }
     }
  print $out $_;
}

Puede agregar tantas palabras clave como desee. Guárdelo en un .plarchivo y ejecútelo en la línea de comando usando:

perl script_name.pl input.cpp

Esto debería crear un nuevo archivo en el directorio llamado restructured_input.cpp. Lo probé en su función de ejemplo y obtuve el resultado deseado.

El hecho de que esto "funcione" en su ejemplo específico no lo convierte en general. No puede "reformatear" una pieza arbitraria de código C++ sin tener un analizador completo de C++. Macros, condicionales de preprocesador, tipos, especificaciones de plantilla (especialmente ">>"), declaraciones lambda, anidamiento, lo que sea, todo va a complicar lo que hay en la "línea de encabezado de función" mucho más allá de lo que este script (o cualquier script que esencialmente no analiza) puede hacer.
@IraBaxter No pretende ser general . Entiendo que los programas reales son más complejos que eso, pero el OP solicitó un requisito muy específico y proporcionó un ejemplo muy simple. La respuesta coincide con esas, y solo sirve para mostrar cómo se puede hacer para casos tan simples. Si el OP necesita más requisitos, depende de él especificarlos en la pregunta según las reglas de este sitio.
Dijo que busco una herramienta que analice el código C++ . Creo que es razonable suponer que quería procesar código C++ arbitrario, no solo el ejemplo.