Pycparser
https://github.com/albertz/pycparser
Un analizador e intérprete escrito en Python. También incluye un generador automático de interfaz CTYPES.
Es más suelto que la gramática C, es decir, debería soportar un superconjunto del lenguaje C en general.
Parte del soporte puede un poco incompleto o incorrecto en este punto porque realmente no seguí estrictamente las especificaciones del idioma, sino que mejoré el analizador por iteración en el código fuente del mundo real.
Proyectos similares
Generadores de interfaz de analgésicos / ctypes :
- Pycparser de Eli Bendersky. Complete un analizador C99 en Pure Python. Depende de Python Lex-YACC (capa). (Todavía no lo probé. Parece ser el proyecto más completo y profesional. Si no desea un intérprete C, este es probablemente el proyecto que debe usar).
- Piclibrary (tenedor Github). Es bastante lento y no funcionó tan bien para mí.
- ctypesgen. También usa Lex+YACC.
- CODENGEN. Utiliza GCC-XML. Vea a continuación sobre las desventajas de tal emproaches.
Intérpretes:
- Cinterpreter. Pitón.
- Cint. No en Python. Probablemente el más famoso.
- Ch. No en Python. No es realmente gratis.
- Depurger de UPS. No en Python.
- Picoc. No en Python. "Un intérprete C muy pequeño".
- Bic. No en Python.
¿Por qué este proyecto?
- Ser más flexible. Ahora es mucho más fácil con un analizador escrito a mano hacer operaciones en ciertos niveles de la tubería de análisis.
- Quería tener un código autónomo que también pueda ejecutarse fácilmente en el lado del usuario final. Por lo tanto, el usuario final puede actualizar la lib y sus encabezados y luego alguna aplicación que usa este Python Lib utilizará automáticamente el LIB actualizado. Esto no es posible si generó la interfaz CTYPES estáticamente (a través de alguna herramienta basada en GCC-XML).
- Quería implementar PYSDL y no quería traducir los encabezados SDL a mano. Además, no quería usar herramientas existentes para hacer esto para evitar un mayor mantenimiento del trabajo en algún momento posterior. Vea el proyecto para obtener más información.
- Esta funcionalidad podría usarse de manera similar para muchas otras bibliotecas C.
- Un desafío para mí. Sólo para travesura. :)
Ejemplos
- Pysdl. También utiliza el envoltorio automático de Ctypes y lo asigna a un módulo Python.
- Pycpython. Interpreta a Cpython en Python.
- Pylua. Interpreta a Lua en Python.
También vea el ejemplo de las pruebas/test_interpreter. {C, Py} 'Hello World'.
Pruebe también ./demos/interactive_interpreter.py --debug .
Estado actual
- Muchos programas C simples deben analizarse e interpretar correctamente ahora.
- Estoy bastante seguro de que Function Pointer Typedefs se maneja incorrectamente. Por ejemplo,
typedef void f(); y typedef void (*f)(); son lo mismo en este momento. Vea cpre3_parse_typedef y haga algunas pruebas si desea solucionar esto. - Todavía faltan muchas funciones de la biblioteca C Standard C.
- Puede haber algunos errores. :)
- C ++ aún no es compatible. :)
- El estilo del código no se ajusta a las convenciones de PEP8 y Python estándar en muchos lugares, ya que es bastante antiguo. Además, probablemente debería reestructurarse, ya que ha crecido demasiado en archivos individuales. Lentamente estoy arreglando esto.
¿Cómo funciona el intérprete?
Esto es probablemente un poco inusual. Envolvemos las funciones de biblioteca C estándar más importantes directamente a la LIBC nativa, a través de ctypes . Traducimos el código C analizado a un AST de Python equivalente (a través de ast ), lo que hace un uso intensivo de ctypes . Luego solo ejecutamos este código Python generado. Pero también podemos tirarlo. Por lo tanto, podemos compilar el código C en un programa de Python equivalente.

--- Albert Zeyer, http://www.az2000.de