Il existe un théorème populaire qui dit que C est difficile à analyser et C ++ essentiellement impossible.
Ce n'est pas vrai.
Ce qui est vrai, c'est que C et C ++ sont assez difficiles à analyser à l'aide des analyseurs LALR (1) sans pirater la machinerie d'analyse et enchevêtrer les données de la table de symboles. GCC en fait utilisé pour les analyser, en utilisant YACC et d'autres hackers comme celui-ci, et oui, c'était moche. Maintenant, GCC utilise des analyseurs manuscrits, mais toujours avec le piratage de la table des symboles. Les gens de Clang n'ont jamais essayé d'utiliser des générateurs d'analyseurs automatisés; AFAIK l'analyseur de Clang a toujours été une descente récursive codée à la main.
Ce qui est vrai, c'est que C et C ++ sont relativement faciles à analyser avec des analyseurs générés automatiquement plus puissants, par exemple des analyseurs GLR , et vous n'avez pas besoin de hacks. L' analyseur Elsa C ++ en est un exemple. Notre frontal C ++ est un autre (comme le sont tous nos frontaux "compilateurs", GLR est une technologie d'analyse assez merveilleuse).
Notre frontal C ++ n'est pas aussi rapide que celui de GCC, et certainement plus lent qu'Elsa; nous avons mis peu d'énergie à le régler avec soin parce que nous avons d'autres problèmes plus urgents (néanmoins, il a été utilisé sur des millions de lignes de code C ++). Elsa est probablement plus lente que GCC simplement parce qu'elle est plus générale. Compte tenu de la vitesse du processeur de nos jours, ces différences peuvent ne pas avoir beaucoup d'importance dans la pratique.
Mais les «vrais compilateurs» qui sont largement diffusés aujourd'hui ont leurs racines dans des compilateurs d'il y a 10 ou 20 ans ou plus. Les inefficacités importaient alors beaucoup plus, et personne n'avait entendu parler des analyseurs GLR, alors les gens faisaient ce qu'ils savaient faire. Clang est certes plus récent, mais les théorèmes folkloriques conservent leur «force de persuasion» pendant longtemps.
Vous n'avez plus à le faire de cette façon. Vous pouvez très raisonnablement utiliser GLR et d'autres analyseurs de ce type comme frontaux, avec une amélioration de la maintenabilité du compilateur.
Ce qui est vrai, c'est qu'il est difficile d'obtenir une grammaire qui correspond au comportement de votre compilateur de quartier convivial. Alors que pratiquement tous les compilateurs C ++ implémentent (la plupart) du standard d'origine, ils ont également tendance à avoir beaucoup d'extensions de coins sombres, par exemple, les spécifications DLL dans les compilateurs MS, etc. Si vous avez un moteur d'analyse puissant, vous pouvez passer votre temps à essayer d'obtenir la grammaire finale pour correspondre à la réalité, plutôt que d'essayer de plier votre grammaire pour correspondre aux limites de votre générateur d'analyseur.
EDIT Novembre 2012: Depuis l'écriture de cette réponse, nous avons amélioré notre frontal C ++ pour gérer le C ++ 11 complet, y compris les dialectes de variantes ANSI, GNU et MS. Bien qu'il y ait eu beaucoup de choses supplémentaires, nous n'avons pas à changer notre moteur d'analyse; nous venons de réviser les règles de grammaire. Nous ne devons changer l'analyse sémantique; C ++ 11 est sémantiquement très compliqué, et ce travail submerge l'effort pour faire fonctionner l'analyseur.
EDIT Février 2015: ... gère désormais le C ++ 14 complet. (Voir obtenir un AST lisible par l'homme à partir du code c ++ pour des analyses GLR d'un simple bout de code et la tristement célèbre "analyse la plus vexante" de C ++).
EDIT avril 2017: gère maintenant (brouillon) C ++ 17.