L'analisi del C ++ sta diventando difficile. L'analisi di Java sta diventando altrettanto difficile.
Vedi questa risposta SO che spiega perché C (e C ++) è "difficile" da analizzare . Il breve riassunto è che le grammatiche C e C ++ sono intrinsecamente ambigue; che vi darà più analizza e si devono utilizzare contesto per risolvere le ambiguità. Le persone quindi commettono l'errore di presumere che sia necessario risolvere le ambiguità durante l'analisi; non è così, vedi sotto. Se ti ostini a risolvere le ambiguità durante l'analisi, il tuo parser diventa più complicato e molto più difficile da costruire; ma quella complessità è una ferita autoinflitta.
IIRC, la grammatica LALR (1) "ovvia" di Java 1.4 non era ambigua, quindi era "facile" da analizzare. Non sono così sicuro che il Java moderno non abbia almeno ambiguità locali a lunga distanza; c'è sempre il problema di decidere se "... >>" chiude due template o è un "operatore di spostamento a destra". Sospetto che Java moderno non analizzi più con LALR (1) .
Ma si può superare il problema dell'analisi utilizzando potenti parser (o parser deboli e hack di raccolta del contesto come fanno principalmente i front-end C e C ++ ora), per entrambi i linguaggi. C e C ++ hanno l'ulteriore complicazione di avere un preprocessore; questi sono più complicati nella pratica di quanto sembri. Un'affermazione è che i parser C e C ++ sono così difficili che devono essere scritti a mano. Non è vero; puoi costruire parser Java e C ++ perfettamente con i generatori di parser GLR.
Ma l'analisi non è davvero dove si trova il problema.
Dopo aver analizzato, vorrai fare qualcosa con l'albero di analisi / AST. In pratica, è necessario sapere, per ogni identificatore, qual è la sua definizione e dove viene utilizzato ("risoluzione di nome e tipo", sciatto, costruzione di tabelle di simboli). Questo risulta essere MOLTO più lavoro che ottenere il parser corretto, aggravato da ereditarietà, interfacce, sovraccarico e modelli, e confuso dal fatto che la semantica per tutto questo è scritta in un linguaggio naturale informale distribuito su decine di centinaia di pagine dello standard linguistico. Il C ++ è davvero pessimo qui. Java 7 e 8 stanno diventando piuttosto terribili da questo punto di vista. (E le tabelle dei simboli non sono tutto ciò di cui hai bisogno; guarda la mia biografia per un saggio più lungo su "Life After Parsing").
La maggior parte delle persone ha difficoltà con la parte di analisi pura (spesso non finisce mai; controlla SO stesso per le molte, molte domande su come costruire parser funzionanti per i linguaggi reali), quindi non vedono mai la vita dopo l'analisi. E poi otteniamo teoremi popolari su ciò che è difficile da analizzare e nessun segnale su ciò che accade dopo quella fase.
La correzione della sintassi C ++ non ti porterà da nessuna parte.
Per quanto riguarda la modifica della sintassi C ++: scoprirai che devi applicare patch a molti punti per occuparti della varietà di ambiguità locali e reali in qualsiasi grammatica C ++. Se insisti, il seguente elenco potrebbe essere un buon punto di partenza . Affermo che non ha senso farlo se non sei il comitato per gli standard C ++; se lo facessi e costruissi un compilatore usando quello, nessuno sano di mente lo userebbe. Si è investito troppo nelle applicazioni C ++ esistenti per cambiare per comodità dei ragazzi che costruiscono parser; inoltre, il loro dolore è finito e gli analizzatori esistenti funzionano bene.
Potresti voler scrivere il tuo parser. Ok va bene; semplicemente non aspettarti che il resto della comunità ti permetta di cambiare la lingua che deve usare per renderti più facile. Vogliono tutti che sia più facile per loro, e questo è usare il linguaggio così come documentato e implementato.