2009-12-23 10 views
14

¿Alguien sabe de manera espectacular usar archivos de encabezado C en Python? Por ejemplo, tengo un programa C que incluye una variable global:Cómo analizar un archivo de cabecera en C?

typedef struct ImageInfo 
{ 
    uint8_t revisionMajor; 
    uint8_t revisionMinor; 
    uint16_t checksum;  

} ImageInfo; 

ImageInfo gImageInfo; /* Placed at a specific address by the linker */ 

me gustaría ser capaz de tomar el binario generado por el compilador de C/enlazador y analizar esta estructura (y posiblemente modificarlo) con un Python guión.

+0

La estructura probablemente no exista "en el binario" como tal, en realidad no "existe" hasta el momento de la ejecución después de que el SO cargó el programa en la RAM. Entonces, ¿qué estás tratando de hacer exactamente? –

+0

Whoops Olvidé mencionar que la variable global se coloca en la memoria de solo lectura (es decir, Flash o ROM). En el ejemplo anterior gImageInfo se colocaría en el desplazamiento 0x1000 en el binario y quiero poder leer la estructura con Python y obtener la información de revisión para verificar la suma de comprobación. – waffleman

Respuesta

12

Have a look at this C++ header parser written in Python. También puede escribir su propio analizador usando cualquiera de estas herramientas:

+1

Excelentes referencias: no sabía de algunos de esos módulos. Me gustaría saber qué tan completas son en comparación con pygccxml (que claramente tiene una ventaja ya que está respaldado por GCC). Escribir un analizador de C++ es notoriamente difícil (aunque la pregunta era sobre el análisis C). Sería bueno usar algo más ligero que la pila completa basada en GCCXML, si es posible. – jkp

8

Eche un vistazo a pygccxml. Lo uso para construir gráficos en memoria de mi código fuente C/C++ que puedo usar como base para muchas tareas de generación de código.

PD: Cuando comencé con la generación de código basada en Python, en realidad traté de escribir un analizador: ahórrese el dolor y ¡ni siquiera vaya allí! (parece que ya está claro ...) pygccxml es todo lo que quiere y más :)

22

Esto fue mencionado en lo que ayer ; No he tenido la oportunidad de verificarlo más a fondo aún, pero lo estoy haciendo. El pycparser, un "analizador C y generador AST escrito en Python".

https://github.com/eliben/pycparser

+0

Si bien la historia es ostensiblemente antigua, esta respuesta merece al menos 2 votos al alza más: ofrece la capacidad de hacer exactamente lo que solicita la publicación original. – synthesizerpatel

+0

como se usa en http://stackoverflow.com/a/13822683/181772 (con código de ejemplo) –

2

Con el mismo fin que estoy considerando pyclibrary, que no es un analizador completo en C, pero está dirigido a analizar los archivos de cabecera C, por lo que es mucho más fácil de usar que pycparser o algún gccxml- Analizador basado: aunque está poco documentado, simplemente intente CParser.py testHeader.h y verá cómo funciona.

Depende del pyparsing y, por lo que yo entiendo, es python puro.

Cuestiones relacionadas