2009-10-25 9 views
6

Quiero un script de python para imprimir la lista de todas las funciones definidas en un archivo C/C++.Script de Python para imprimir todas las definiciones de funciones de un archivo C/C++

p. Ej. abc.c define dos funciones:

void func1() { } 
int func2(int i) { printf("%d", i); return 1; } 

sólo quiero buscar el archivo (abc.c) e imprimir todas las funciones definidas en el mismo (sólo los nombres de función). En el ejemplo anterior, me gustaría imprimir func1, func2 usando la secuencia de comandos python.

+1

¿Sabe cómo identificar una función y está preguntando cómo implementarla, o está preguntando cómo identificar una función c def? – foosion

Respuesta

3

se recomienda usar la herramienta PLY lex/yacc. Hay un analizador C precompilado, y el analizador en sí es bastante rápido. Una vez que haya analizado el archivo, no debería ser demasiado difícil encontrar todas las funciones.

http://www.dabeaz.com/ply/

1

para hacer esto de forma fiable, que había necesidad de analizar el código C o C++, y luego tomar las definiciones de las funciones de la AST produce el analizador.

C es bastante fácil de analizar. Como pavpanchekha menciones, la capa analizador viene con un analizador de C, y se ha utilizado para realizar los siguientes proyectos relevantes:

de análisis de C++ es más complicado .. "Is there a good Python library that can parse C++" debería ser de ayuda:

C++ es notoriamente difícil de analizar. La mayoría de las personas que intentan hacer esto correctamente terminan desarmando un compilador. De hecho, esto es (en parte) por lo que comenzó LLVM: Apple necesitaba una forma en que pudieran analizar C++ para usar en XCode que coincidiera con la forma en que el compilador lo analizó.

Es por eso que hay proyectos como GCC_XML que se pueden combinar con una biblioteca python xml.

Por último, si el código no tiene que ser robusto en absoluto, podría ejecutar el código a través de un código-reformador, como indent (para el código C) para igualar las cosas, a continuación, utilizar expresiones regulares para que coincida la definición de la función. Sí, esta es una idea mala, hacky, propensa a errores, y probablemente encontrará definiciones de funciones en comentarios de líneas múltiples y tal, pero podría funcionar bastante bien ...

1

Esta página, Parsing C++, menciona un par de gramáticas ANTLR para C++. Desde ANTLR has a Python API esto parece una forma razonable de proceder.

Aunque el análisis puede parecer mucho más complejo que las expresiones regulares, este es un caso en el que otra persona ha hecho casi todo el trabajo por usted y solo necesita interactuar desde Python.

Otra alternativa, donde alguien más ha hecho el trabajo de analizar C++ para usted, es pygccxml que aprovecha GCCXML, una extensión de salida para que GCC produzca XML a partir de la representación interna de los compiladores. Como Python tiene una gran compatibilidad con XML, solo necesita extraer la información que le interesa.

Cuestiones relacionadas