Representación de código C++ para la detección automática de patrones de diseño

Estoy trabajando en un proyecto de investigación en el que pretendo crear una herramienta que detecte automáticamente la implementación de ciertos patrones de diseño en código C++.

El código C++ es complejo, quiero tener una vista simplificada del código fuente del proyecto C++ dado, digamos XML.

Mi primera pregunta es: ¿sería este un buen enfoque? ¿Hay alguna herramienta que pueda ayudarme a lograr esto?

¿C++ simplificado como XML? <if><condition>...</condition><then>...</then><else>...</else></if>DIOS MÍO...
@ThomasWeller Creo que no lo entendiste, es más bien algo como esto:<Class name="ClassName" Visibility="Public" IsStatic="false"> <Fields> ... </Fields> <Methods> <Method name="DoSomething" visibility="Public" returnType="void"> <Parameters> ... </Parameters> ... </Methods> ... </Class>

Respuestas (3)

Puede probar CppDepend y la consulta de código langugae CQLinq para detectar algunos patrones de diseño. Aquí hay un artículo que explica cómo hacerlo.

Su "vista simplificada" necesitaría aplicar el preprocesador C/C++, aplicar incluye y analizar, como mínimo. Esa es la mayor parte de la parte frontal de un compilador. Realmente no es una buena idea intentar escribir algo así tú mismo. Es una buena idea, si desea realizar un análisis estático de código en un lenguaje compilado como C++, ponerse al tanto de un compilador o marco de compilación existente.

Es probable que su marco de referencia del compilador sea LLVM , sobre el cual se construye el compilador clang++. Me han dicho que está bastante bien instrumentado, aunque todavía no he llegado a usarlo yo mismo.

GCC también puede ser una posibilidad, aunque algo menos popular.

Finalmente, si tiene el árbol de sintaxis abstracta en cualquier representación que LLVM o algún otro marco lo mantenga, creo que no querrá convertirlo a XML, sino hacer algo con él tal como está; pero por supuesto que puedo estar equivocado.

Nuestro front-end C++ realiza un análisis preciso del lenguaje C++, crea AST y realiza una resolución completa de nombre y tipo, y controla las construcciones y los gráficos de flujo de datos de cada función/método. [Como cuestión práctica, no puede razonar de manera efectiva sobre el código fuente solo a partir del AST. Debe tener información sobre el significado de los nombres.]

La maquinaria subyacente, el kit de herramientas de reingeniería de software DMS , brinda la capacidad de hacer coincidencias de patrones de origen utilizando patrones explícitos con sintaxis C++ , así como muchas otras capacidades útiles en el análisis de código general.

Se ejecuta de forma nativa en Windows y sin problemas en Wine/Linux mediante scripts sh.

Si insiste, puede exportar el AST y otros artefactos como XML. Cuando hace eso, pierde el acceso a toda la otra maquinaria útil proporcionada por DMS. Según nuestra experiencia, se pierde mucha más capacidad de la que se gana al XMLificar y luego tener que reinventar toda la maquinaria de análisis necesaria.