¿Es posible analizar C++ con declaraciones incompletas con clang con su API libclang existente? Es decir. analizar el archivo .cpp sin incluir todos los encabezados, deducir declaraciones sobre la marcha. por lo tanto, p. El siguiente texto:Clang para el análisis difuso C++
A B::Foo(){return stuff();}
detectará desconocida símbolo A, llamar a mi devolución de llamada que deduce A es una clase usando mi heurística magia, a continuación, llamar a esta devolución de llamada de la misma manera con B y Foo y esas cosas. Al final quiero poder inferir que vi a un miembro Foo de la clase B que devuelve A, y eso es una función ... O algo por el estilo. contexto: Quiero ver si puedo hacer un resaltado de sintaxis sensible y sobre la marcha de análisis de código sin analizar todos los encabezados muy rápidamente.
[EDIT] Para aclarar, estoy buscando un análisis de C++ muy restringido, posiblemente con cierta heurística para levantar algunas de las restricciones.
La gramática de C++ está llena de dependencias de contexto. Es Foo() una llamada de función o una construcción de un temporal de la clase Foo? Es Foo <Bar> cosas; una plantilla Foo <Bar> creación de instancias y declaración de cosas variables, o ¿son 2 llamadas extrañas al operador sobrecargado < y operador>? Solo es posible decir en contexto, y el contexto a menudo proviene del análisis de los encabezados.
Lo que estoy buscando es una forma de conectar mis reglas de convención personalizadas. P.ej. Sé que no sobrecargo los símbolos de Win32, así que puedo asumir con seguridad que CreateFile es siempre una función, e incluso sé su firma. También sé que todas mis clases comienzan con una letra mayúscula y son sustantivos, y las funciones suelen ser verbos, por lo que puedo suponer razonablemente que Foo y Bar son nombres de clase. En un escenario más complejo, sé que no escribo expresiones libres de efectos secundarios como < b> c; así que puedo suponer que a siempre es una instanciación de plantilla. Y así.
Entonces, la pregunta es si es posible usar Clang API para devolver la llamada cada vez que se encuentra con un símbolo desconocido, y darle una respuesta usando mi propia heurística no C++. Si mi heurística falla, entonces el análisis fracasa, obviamente. Y no estoy hablando de analizar la biblioteca Boost :) Estoy hablando de C++ muy simple, probablemente sin plantillas, restringido a un mínimo que clang puede manejar en este caso.
Siempre puede modificar CLang directamente. No estoy seguro de lo fácil que sería, ya que hay muchas ocasiones en que la búsqueda puede dar como resultado que no se encuentre nada (por ejemplo, contextos dependientes, ADL). –
¿Definitivamente necesitas clang? Si no, tal vez tiene sentido probar otras soluciones? Puede suceder que funcionen mejor. –
Sí, miré a antlr, y es factible, aunque sospecho que sería más difícil y menos eficiente ... De hecho, estoy usando antlr para analizar algunos C++ limitados, por lo que sería familiar para mí. ¿Hay otras alternativas reales? –