Existe um teorema popular que diz que C é difícil de analisar e C ++ essencialmente impossível.
Não é verdade.
O que é verdade é que C e C ++ são muito difíceis de analisar usando analisadores LALR (1) sem hackear o mecanismo de análise e confundir os dados da tabela de símbolos. Na verdade, o GCC costumava analisá-los, usando YACC e hackery adicional como esse, e sim, era feio. Agora o GCC usa analisadores escritos à mão, mas ainda com o hackery da tabela de símbolos. O pessoal do Clang nunca tentou usar geradores de analisador automatizado; AFAIK, o analisador Clang sempre foi descendente recursivo codificado manualmente.
O que é verdade, é que C e C ++ são relativamente fáceis de analisar com analisadores mais fortes gerados automaticamente, por exemplo, analisadores GLR , e você não precisa de nenhum hacks. O analisador Elsa C ++ é um exemplo disso. Nosso front-end C ++ é outro (assim como todos os nossos front-ends de "compilador", GLR é uma tecnologia de análise bastante maravilhosa).
Nosso front-end C ++ não é tão rápido quanto o do GCC e certamente mais lento que o Elsa; colocamos pouca energia em ajustá-lo cuidadosamente porque temos outros problemas mais urgentes (embora ele tenha sido usado em milhões de linhas de código C ++). Elsa é provavelmente mais lento que o GCC simplesmente porque é mais geral. Dadas as velocidades do processador hoje em dia, essas diferenças podem não importar muito na prática.
Mas os "compiladores reais" que são amplamente distribuídos hoje têm suas raízes em compiladores de 10 ou 20 anos atrás ou mais. As ineficiências importavam muito mais, e ninguém tinha ouvido falar dos analisadores GLR, então as pessoas faziam o que sabiam fazer. O Clang é certamente mais recente, mas os teoremas populares mantêm seu "poder de persuasão" por muito tempo.
Você não precisa mais fazer assim. Você pode usar o GLR e outros analisadores como front-ends, com uma melhoria na manutenção do compilador.
O que é verdade é que obter uma gramática que corresponda ao comportamento do compilador de sua vizinhança amigável é difícil. Embora praticamente todos os compiladores C ++ implementem (a maioria) do padrão original, eles também tendem a ter muitas extensões de canto escuro, por exemplo, especificações de DLL em compiladores MS, etc. Se você tiver um motor de análise forte, pode gastar seu tempo tentando obter a gramática final para corresponder à realidade, em vez de tentar dobrar sua gramática para corresponder às limitações de seu gerador de analisador.
EDITAR novembro de 2012: desde que escrevemos esta resposta, melhoramos nosso front-end C ++ para lidar com C ++ 11 completo, incluindo ANSI, GNU e dialetos variantes MS. Embora houvesse muitas coisas extras, não precisamos mudar nosso mecanismo de análise; acabamos de revisar as regras gramaticais. Tivemos que mudar a análise semântica; C ++ 11 é semanticamente muito complicado e este trabalho atrapalha o esforço para fazer o analisador funcionar.
EDITAR fevereiro de 2015: ... agora lida com C ++ 14 completo. (Consulte obter AST legível por humanos a partir do código c ++ para análises GLR de um simples trecho de código e a infame "análise mais irritante" do C ++).
EDITAR abril de 2017: agora lida com (rascunho) C ++ 17.