2010-02-17 24 views
11

¿Hay alguna forma de utilizar el analizador llvm-clang de forma incremental/en línea?llvm-clang: analizador incremental o en línea?

Digamos que estoy escribiendo un editor y quiero poder analizar el código de C++ que tengo delante de mí.

No quiero escribir mi propio analizador pirateado.

Me gustaría usar algo con todas las funciones, como llvm-clang.

¿Hay una manera fácil de secuestrar el analizador llvm-clang? (¿Y es lo suficientemente rápido como para ejecutarlo continuamente en el fondo)?

Gracias!

+0

Alguien quiere hacer un clon de Visual Studio [para detectar errores antes de compilar] :) – Earlz

+0

Interesante proyecto. He estado esperando durante un tiempo a que alguien escriba un IDE basado en Clang. Si termina construyendo un IDE completo, considere usar CMake como su sistema de compilación/archivos de proyecto. – Tronic

+3

Quizás libclang ['clang_reparseTranslationUnit()'] (http://clang.llvm.org/doxygen/group__CINDEX__TRANSLATION__UNIT.html#ga524e76bf2a809d037934d4be51ea448a) pueda satisfacer su necesidad? – bames53

Respuesta

3

No creo sonido metálico puede analizar de forma incremental archivos de C++, pero es una de sus metas del proyecto: http://clang.llvm.org/features.html

que he escrito algo similar para mi proyecto final. No era un editor de C++, sino un plugin de Visual Studio, cuya tarea principal era mejorar la inteligencia en C++ (como Visual Assist X).

Cuando estaba escribiendo este proyecto, también he estado pensando en el analizador sintáctico C++, pero no he encontrado ninguna solución adecuada. Para resolver el problema intellisense de C++ utilicé el analizador C++ normal de GCC. Sin embargo, fue lento, para analizar el archivo después de cada solicitud de finalización de código (ctrl + espacio), simplemente intente incluir boost :: spirit. Para que este proyecto funcione correctamente, analicé los archivos en segundo plano y, después de cada solicitud de finalización de código, comparé el archivo actual con su versión anterior (a través de diff) para detectar los cambios realizados desde el último análisis. Al tener esos cambios, actualicé el árbol de sintaxis, principalmente agregando o eliminando variables.

Excepto el análisis incremental, también hay otro problema con proyectos como este. En su mayoría estarás analizando el código de C++ que se está editando, por lo que es un código no válido. Dada la gramática compleja de C++, a veces el analizador no podrá recuperarse de los errores de sintaxis, por lo que no detectará correctamente algunos símbolos en el código.

Otro problema es C++ parsers/compilers differences. Digamos que estoy usando el trabajo en Visual Studio y he usado alguna construcción específica del compilador de VC++ en mi código. El analizador de Clang no podrá analizarlo correctamente.

0

Para escribir algo similar a IntelliSense, le aconsejo que escriba su propio analizador usando el algoritmo de análisis LALR. Ya que puedes guardar su estado en cada línea para que no tengas que volver a rastrear todo el archivo cuando se haya editado un archivo, ¡lo cual es muy rápido!
Tenga en cuenta que C++ no se puede expresar completamente en BNF, pero creo que podría llegar bastante lejos con algunos ajustes. Por supuesto, es mucho más trabajo que usar la interfaz de Clang, pero aún puedes usar Clang para analizar archivos de encabezado en colaboración con tu propio analizador escrito.

+0

El problema es que es realmente difícil obtener un analizador de C++ correcto. Lo que sea que escribas es probable que no tenga el comportamiento exacto del compilador real. Idealmente, y este es uno de los objetivos del proyecto clang, la misma biblioteca utilizada para compilar el compilador puede ser reutilizada por el IDE para obtener resultados consistentes. – bames53