Hay un teorema popular que dice que C es difícil de analizar y C ++ esencialmente imposible.
No es verdad
Lo que es cierto es que C y C ++ son bastante difíciles de analizar utilizando analizadores LALR (1) sin piratear la maquinaria de análisis y enredar los datos de la tabla de símbolos. De hecho, GCC solía analizarlos, usando YACC y hacker adicional como este, y sí, era feo. Ahora GCC usa analizadores escritos a mano, pero aún con el hacker de tabla de símbolos. La gente de Clang nunca intentó utilizar generadores de analizadores automáticos; AFAIK, el analizador de Clang siempre ha sido un descenso recursivo codificado a mano.
Lo que es cierto es que C y C ++ son relativamente fáciles de analizar con analizadores generados automáticamente más fuertes, por ejemplo, analizadores GLR , y no necesita ningún truco. El analizador Elsa C ++ es un ejemplo de esto. Nuestro Front End de C ++ es otro (al igual que todos nuestros front-end de "compiladores", GLR es una tecnología de análisis bastante maravillosa).
Nuestra interfaz de C ++ no es tan rápida como la de GCC, y ciertamente más lenta que la de Elsa; hemos puesto poca energía en ajustarlo con cuidado porque tenemos otros problemas más urgentes (no obstante, se ha utilizado en millones de líneas de código C ++). Es probable que Elsa sea más lenta que GCC simplemente porque es más general. Dadas las velocidades del procesador en estos días, estas diferencias pueden no importar mucho en la práctica.
Pero los "compiladores reales" que se distribuyen ampliamente hoy tienen sus raíces en compiladores de hace 10 o 20 años o más. Entonces, las ineficiencias importaban mucho más, y nadie había oído hablar de los analizadores GLR, por lo que la gente hizo lo que sabía hacer. Clang es ciertamente más reciente, pero los teoremas populares conservan su "capacidad de persuasión" durante mucho tiempo.
Ya no tienes que hacerlo de esa manera. Puede usar GLR y otros analizadores como interfaces de manera muy razonable, con una mejora en la capacidad de mantenimiento del compilador.
Lo que es cierto, es que conseguir una gramática que coincide con el comportamiento de su vecindario amigable compilador es difícil. Si bien prácticamente todos los compiladores de C ++ implementan (la mayoría) del estándar original, también tienden a tener muchas extensiones de esquinas oscuras, por ejemplo, especificaciones de DLL en compiladores de MS, etc. Si tiene un motor de análisis sólido, puede dedicar su tiempo a intentar obtener la gramática final para que coincida con la realidad, en lugar de intentar modificar su gramática para que coincida con las limitaciones de su generador de analizador sintáctico.
EDITAR noviembre de 2012: desde que escribí esta respuesta, hemos mejorado nuestra interfaz de C ++ para manejar C ++ 11 completo, incluidos los dialectos variantes ANSI, GNU y MS. Si bien había muchas cosas adicionales, no tenemos que cambiar nuestro motor de análisis; acabamos de revisar las reglas gramaticales. Nosotros nos tenemos que cambiar el análisis semántico; C ++ 11 es semánticamente muy complicado, y este trabajo ahoga el esfuerzo para hacer que el analizador se ejecute.
EDITAR Febrero de 2015: ... ahora maneja C ++ 14 completo. (Consulte obtener AST legible por humanos a partir del código c ++ para análisis GLR de un simple fragmento de código, y el infame "análisis más molesto" de C ++).
EDITAR Abril de 2017: ahora maneja (borrador) C ++ 17.