Il y a un folk-théorème qui dit que C est difficile à analyser, et le C++ est essentiellement impossible.
Ce n'est pas vrai.
Ce qui est vrai est que le C et le C++ sont assez difficile à analyser à l'aide de LALR(1) les analyseurs sans le piratage de l'analyse de la machinerie et de s'emmêler dans la table des symboles de données. GCC en fait utilisée pour analyser, à l'aide de YACC et supplémentaires hackery comme ça, et oui c'était laid. (Maintenant GCC utilise manuscrite des analyseurs, mais toujours avec le symbole de la table hackery. Oui, c'est toujours aussi moche!)
Ce qui est vrai, c'est que le C et le C++ sont relativement faciles à analyser avec plus d'analyseurs, par exemple, GLR analyseurs, et vous n'avez pas besoin de tous les hacks. L' Elsa analyseur C++ est un exemple. Notre interface C++ est un autre (comme le sont tous nos "compilateur" frontaux, GLR est assez merveilleux analyse de la technologie).
Notre interface C++ n'est pas aussi rapide que du CCG, et certainement plus lent que d'Elsa; nous avons mis peu d'énergie dans le tuning avec précaution car nous avons d'autres questions plus urgentes (néanmoins il a été utilisé sur des millions de lignes de code C++). Elsa est probablement plus lent que GCC simplement parce qu'il est plus général. Compte tenu de la vitesse des processeurs, ces jours, ces différences n'importe pas beaucoup dans la pratique.
Mais la "vraie compilateurs", qui sont largement diffusés aujourd'hui ont leurs racines dans les compilateurs de 10 ou 20 ans ou plus. Les inefficacités puis importait beaucoup plus, et personne n'avait entendu parler de GLR d'analyseurs, de sorte que les gens ont fait ce qu'ils savaient comment faire. Clang est certes plus récente, mais ensuite folk théorèmes de conserver leur "force de persuasion" pour un long moment.
Vous n'avez pas à faire plus de cette façon. Vous pouvez très raisonnablement utiliser GLR et d'autres analyseurs de front se termine, avec une amélioration dans le compilateur de maintenabilité.
Ce qui est vrai, c'est que l'obtention d'une grammaire qui correspond à votre quartier sympathique du compilateur comportement est dur. Alors que pratiquement tous les compilateurs C++ mettre en œuvre (la plupart) de la norme d'origine, ils ont aussi tendance a beaucoup de coin sombre extensions, par exemple, DLL spécifications MS compilateurs, etc. Si vous avez un fort moteur d'analyse, vous pouvez
passer votre temps à essayer de faire la finale de la grammaire afin de correspondre à la réalité, plutôt que d'essayer de plier votre grammaire de faire correspondre les limites de votre analyseur générateur.
EDIT de novembre 2012: Depuis la rédaction de cette réponse, nous avons amélioré notre interface C++ pour gérer plein de C++11, ANSI, GNU, et MME variante de dialectes. Alors qu'il y a beaucoup de trucs supplémentaires, nous n'avons pas à changer notre moteur de l'analyse; nous vient de réviser les règles de grammaire. Nous n' avons pour modifier l'analyse sémantique; C++11 est sémantiquement très compliqué, et ce travail marécages de l'effort pour obtenir l'analyseur à exécuter.