C'è un teorema popolare che dice che C è difficile da analizzare e C ++ essenzialmente impossibile.
Non è vero.
Ciò che è vero è che C e C ++ sono piuttosto difficili da analizzare usando i parser LALR (1) senza hackerare il meccanismo di analisi e aggrovigliarsi nei dati della tabella dei simboli. GCC infatti usava analizzarli, usando YACC e hackery aggiuntivi come questo, e sì, era brutto. Ora GCC utilizza parser scritti a mano, ma ancora con l'hackery della tabella dei simboli. La gente di Clang non ha mai provato a usare generatori di parser automatizzati; Per quanto ne so, il parser Clang è sempre stato una discesa ricorsiva codificata a mano.
Ciò che è vero, è che C e C ++ sono relativamente facili da analizzare con parser generati automaticamente più potenti, ad esempio parser GLR , e non è necessario alcun hack. Il parser Elsa C ++ è un esempio di questo. Il nostro C ++ Front End è un altro (come tutti i nostri front-end "compilatori", GLR è una tecnologia di analisi davvero meravigliosa).
Il nostro front-end C ++ non è veloce come quello di GCC, e certamente più lento di Elsa; abbiamo investito poca energia nel metterlo a punto attentamente perché abbiamo altri problemi più urgenti (tuttavia è stato utilizzato su milioni di righe di codice C ++). Elsa è probabilmente più lenta di GCC semplicemente perché è più generale. Date le velocità del processore in questi giorni, queste differenze potrebbero non avere molta importanza nella pratica.
Ma i "veri compilatori" che sono ampiamente distribuiti oggi hanno le loro radici in compilatori di 10 o 20 anni fa o più. Le inefficienze allora contavano molto di più e nessuno aveva sentito parlare di parser GLR, quindi le persone facevano quello che sapevano fare. Il clang è certamente più recente, ma i teoremi popolari conservano la loro "capacità di persuasione" per molto tempo.
Non devi più farlo in quel modo. Puoi ragionevolmente usare GLR e altri analoghi parser come front-end, con un miglioramento nella manutenibilità del compilatore.
Che cosa è vero, è che ottenere una grammatica che corrisponda al comportamento del tuo amichevole compilatore di quartiere è difficile. Sebbene praticamente tutti i compilatori C ++ implementino (la maggior parte) dello standard originale, tendono anche ad avere molte estensioni degli angoli oscuri, ad esempio, le specifiche DLL nei compilatori MS, ecc. Se hai un potente motore di analisi, puoi passare il tuo tempo a cercare di ottenere la grammatica finale per abbinare la realtà, piuttosto che cercare di piegare la tua grammatica per soddisfare i limiti del tuo generatore di parser.
EDIT Novembre 2012: da quando abbiamo scritto questa risposta, abbiamo migliorato il nostro front-end C ++ per gestire il C ++ 11 completo, inclusi dialetti varianti ANSI, GNU e MS. Anche se c'erano molte cose extra, non dobbiamo cambiare il nostro motore di analisi; abbiamo appena rivisto le regole grammaticali. Noi fatto dovuto cambiare l'analisi semantica; C ++ 11 è semanticamente molto complicato e questo lavoro sommerge lo sforzo per far funzionare il parser.
EDIT Febbraio 2015: ... ora gestisce la versione completa di C ++ 14. (Vedi ottenere AST leggibile dall'uomo dal codice c ++ per l'analisi GLR di un semplice bit di codice e la famigerata "analisi più irritante" di C ++).
EDIT Aprile 2017: ora gestisce (bozza) C ++ 17.