2012-01-11 9 views
6

Necesito ir a través de un archivo C/C++ y extraer la lista de clases y métodos, y dónde se encuentran en el archivo.Cómo analizar/analizar simple código C/C++ de C# para obtener una lista de métodos

¿Es libclang la mejor opción? ¿O es "demasiado" para la tarea?

¿Será mejor simplemente buscar paréntesis?

En caso de que libclang sea la opción: ¿hay alguna manera de invocarlo desde C#?

Gracias!

+0

Por supuesto siempre hay una forma de invocar el código C++ desde .NET, usando C++/CLI. Una solución más portátil sería proporcionar un envoltorio simple de C alrededor de libclang (debería ser bastante sencillo). Pero la mejor solución posible sería ir a una versión anterior de Clang, cuando aún existía su bonita impresora XML. Es realmente triste que haya sido eliminado de Clang. –

+0

Otra opción (un poco oxidado, pero aún funciona para la mayoría de los casos) es el analizador Elsa combinado con el preprocesador gcc. –

+0

No tiene claro la precisión de la respuesta que desea. Podría construir una solución basada en paréntesis de emparejamiento que probablemente produciría información simple de método/clase el 90% del tiempo, con errores espectaculares el otro 10%. ¿Qué piensas hacer con los resultados? –

Respuesta

6

Puede considerar ctags, disponible en muchas plataformas. El resultado es fácil de analizar y está lleno de información que necesita.

más información Para su pregunta, tuve que mirar a las muchas opciones disponibles, y después de un poco lo encontré. Por ejemplo:

ctags -N -x --c-kinds=+p crowd.* 

produce esta salida

CrowdSim   class  44 crowd.h   class CrowdSim 
CrowdSim   function  47 crowd.h   CrowdSim(const std::string& contentDir) : _contentDir(contentDir) {} 
Particle   function  35 crowd.h   Particle() 
Particle   struct  25 crowd.h   struct Particle 
_contentDir  member  56 crowd.h   std::string _contentDir; 
_crowd_H_  macro  18 crowd.h   #define _crowd_H_ 
_particles  member  57 crowd.h   std::vector<Particle> _particles; 
animTime   member  32 crowd.h   float animTime; 
chooseDestination function  24 crowd.cpp  void CrowdSim::chooseDestination(Particle &p) 
chooseDestination prototype 53 crowd.h   void chooseDestination(Particle &p); 
dx    member  28 crowd.h   float dx, dz; // Destination position 
dz    member  28 crowd.h   float dx, dz; // Destination position 
fx    member  29 crowd.h   float fx, fz; // Force on particle 
fz    member  29 crowd.h   float fx, fz; // Force on particle 
init    function  35 crowd.cpp  void CrowdSim::init() 
init    prototype 49 crowd.h   void init(); 
node    member  31 crowd.h   H3DNode node; 
ox    member  30 crowd.h   float ox, oz; // Orientation vector 
oz    member  30 crowd.h   float ox, oz; // Orientation vector 
px    member  27 crowd.h   float px, pz; // Current postition 
pz    member  27 crowd.h   float px, pz; // Current postition 
update   function  68 crowd.cpp  void CrowdSim::update(float fps) 
update   prototype 50 crowd.h   void update(float fps); 

(nota: -x es sólo para facilitar la inspección de usuario)

+0

Parece que esta es probablemente la mejor opción. ¿Te puede decir dónde está el método Y su cuerpo? ¿O solo donde está la declaración del método? – pablo

+0

por ejemplo, para la función CrowdSim :: update, ¿es posible saber dónde está su cuerpo? – pablo

+0

sí, el cuerpo está en la línea crowd.cpp 68 – CapelliC

0

Es mejor utilizar un analizador completo IMO. Puede usar ANTLR. Tiene gramática C/C++ y generador de analizador C#.

+1

La gramática ANTLR para C/C++ no es tan buena como libclang AFAIK. libclang hace el trabajo por usted, debe decorar toda la gramática C/C++ si desea utilizar el modo ANTLR – pablo

+1

Un "analizador completo" no es suficiente, cuando hay un preprocesador y una ruta de acceso de plataforma específica compleja configuración presente. –

+1

... y no creo que la gramática ANTLR esté realmente completa. Las notas de la versión contienen información del autor que dice que realmente no la terminó. –

1

No estoy seguro de cuál es la mejor opción, pero también puede echar un vistazo a GCC-XML o Mono/CXXI. El último usa GCC-XML internamente, pero también proporciona interfaces C# para las definiciones de clases C++.

libclang es una biblioteca C y por lo tanto debe ser utilizable desde .NET a través de P/Invoke, pero puede ser bastante tedioso repetir todas las declaraciones necesarias en C#.

1

Otro ángulo sería crear una extensión para Visual Studio.

+0

Sin duda es una opción, especialmente con las novedades en la última versión, pero me gustaría tener una solución independiente de VS. – pablo

+0

ah, vale. bueno, lo dejo en caso de que alguien lo encuentre útil para sus necesidades. – justin

4

Para hacer esto bien, que realmente necesita algo que contiene un completo C++ analizador

Nuestro DMS Software Reengineering Toolkit con su C++ Front End podría ser utilizado para esto. Puede proporcionar las declaraciones de entidades precisas, incluidos los tipos, y su contexto (clase/espacio de nombres/...) y las posiciones precisas de los archivos. DMS proporciona acceso a toda esta inforamción como un conjunto de AST y tablas de símbolos relacionadas; construyes código personalizado para navegar/tomar lo que quieras.

Dependiendo de sus necesidades, puede encontrar que la información que desea es difícil de procesar usando vainilla C#. La información de tipo en toda su gloria es bastante compleja, porque C++ es un lenguaje complejo. Si desea procesar esa información, querrá "permanecer dentro" de DMS donde esté presente toda la maquinaria para hacerlo. Si todo lo que quiere son los nombres y la información del tipo como cadenas de texto, puede hacer que DMS imprima correctamente esta información en esa forma; tiene bibliotecas estándar que apoyan tales actividades. Una respuesta intermedia sería exportar los datos en formato XML; DMS proporciona soporte directo para exportar fragmentos AST arbitrarios, pero solo soporte indirecto para escribir información de tipo como XML, pero no sería difícil personalizarlo.

EDITAR: (en respuesta al comentario OP en otra respuesta) DMS puede proporcionar información precisa sobre la firma del método y el cuerpo del método. Tiene AST completo y tipo de información para ambos.

+0

¡Suena increíble! Ahora necesito información sobre precios ... ¿cómo puedo contactarme? – pablo

+0

Ver mi biografía para una dirección de correo electrónico. Por supuesto, siempre está el sitio web en sí: -} –

+0

Su primer enlace está roto: O (en esta respuesta) – pablo

1

Si desea utilizar Clang, le recomiendo que eche un vistazo a this page. Demuestra cómo obtener todos los métodos virtuales de un archivo. Una vez que comprenda este simple ejemplo, puede crear comparadores llamados más complejos.

Cuestiones relacionadas