AST desde el código C
abstract-syntax-tree (11)
¿Qué hay de tomar gcc y escribir un backend personalizado para ello? Nunca lo hice ni siquiera trabajé en el código fuente de gcc, así que no sé qué tan difícil sería.
Quiero realizar algunas transformaciones en el código fuente C. Necesito una herramienta en Linux que genere un AST completo a partir del código fuente para que pueda aplicar mis transformaciones en este AST y luego convertirlo de nuevo al código fuente C. Intenté ELSA pero no está compilado. (Estoy usando Ubuntu 8.4). ¿Alguien puede sugerir una mejor herramienta / aplicación?
Puede intentar generar AST (Árbol sintáctico abstracto) usando Lexx y Yacc en Linux:
www.antlr.org
Yo recomendaría clang . Tiene una implementación de C bastante completa con la mayoría de las extensiones de gcc, y el código es muy comprensible. Su implementación en C ++ es incompleta, pero si solo te importa generar AST a partir del código C, eso debería estar bien. Dependiendo de lo que quieras hacer, puedes usar clang como una biblioteca y trabajar directamente con los AST, o puedes enviar clang a la consola.
Realicé pequeñas cantidades de trabajo en las transformaciones fuente-fuente y encontré que CIL es muy poderoso para esta tarea. CIL tiene la ventaja de ser un marco diseñado específicamente para el análisis y transformación de fuentes estáticas. También puede procesar código con cualquier cantidad de extensiones específicas de GCC feas (se ha usado para procesar el kernel de Linux, como un ejemplo). Lamentablemente, está escrito en OCAML, y los análisis / transformaciones creadas con él también deben escribirse en OCAML, que podría ser problemático si nunca lo has usado.
Alternativamente, se supone que clang tiene una base de código relativamente fácil de piratear y ciertamente puede usarse para producir C AST.
"Probé con ELSA pero no está siendo compilado. (Estoy usando Ubuntu 8.4)"
El código fuente de Elkhound y Elsa, versión 2005.08.22b de scottmcpeak.com/elkhound/ está desactualizado (archivos antiguos de encabezado .h de estilo de C ++).
Elsa está trabajando y es parte de Oink: http://www.cubewano.org/oink/#Gettingthecode. Ahora lo tengo trabajando bajo Ubuntu 9.10.
Hay dos proyectos que conozco y que puede encontrar útiles:
Ambos analizan un código fuente C estándar para permitir más análisis y transformación. No los he usado, así que debes verificarlos por ti mismo si se ajustan a tus necesidades.
La sugerencia de usar GCC también es válida, por supuesto. Aunque sé que no hay mucha documentación sobre este aspecto de gcc.
Ver pycparser - un generador Python AST puro para C.
Para obtener una salida AST XML, puede intentar usar cscan de MarpaX :: Languages :: C :: AST . La salida se verá así:
xml <cscan> <typedef_hash> <typedef id="GLenum" before="unsigned int" after="" file="/usr/include/GL/gl.h"/> ...
Nuestro kit de herramientas de reingeniería de software DMS se ha utilizado en enormes sistemas C, analizando, analizando, transformando y regenerando el código C. Se ejecuta en Windows y se ejecutará en Linux en Wine, pero maneja el código C de estilo Linux (GCC).
No puedo enfatizar lo suficiente la capacidad de recorrer el código fuente C: analizar, construir árboles, transformar, regenerar códigos compilables en C con los comentarios y bien impresos o con la sangría del programador original. Algunas de las otras respuestas aquí sugieren sistemas que pueden hacer eso de manera robusta.
El hecho de que DMS está diseñado para llevar a cabo transformaciones de programa (a diferencia de otros sistemas sugeridos en las respuestas aquí) también es una gran ventaja. DMS proporciona coincidencias y reescrituras del patrón de árbol; aumenta esto con un control total y análisis de flujo de datos que se utilizarán para ampliar las condiciones que le gustaría igualar. Una herramienta que pretende ser un compilador es solo eso, y le resultará muy difícil convencerlo de que no sea un compilador y, en su lugar, un motor de transformación como solicitó el OP.
Consulte https://.com/a/2173477/120163, por ejemplo, AST producidos por DMS.