C ++の解析は難しくなっています。Javaの解析も同様に困難になっています。
C(およびC ++)が解析が「難しい」理由については、このSOの回答を参照してください。要約すると、CおよびC ++の文法は本質的にあいまいです。それらは複数の解析を提供し、あいまいさを解決するにはコンテキストを使用する必要があります。そうすると、解析の際に曖昧さを解決しなければならないと思い込んでしまいます。そうでない場合は、以下を参照してください。解析時にあいまいさを解決することを主張すると、パーサーはより複雑になり、構築がはるかに難しくなります。しかし、その複雑さは自傷行為です。
IIRC、Java 1.4の「明白な」LALR(1)文法はあいまいではなかったため、解析が「簡単」でした。私は、現代のJavaが少なくとも長距離のローカルな曖昧さを持っていないかどうかはわかりません。"... >>"が2つのテンプレートを閉じるのか、それとも "右シフト演算子"なのかを決定する問題が常にあります。私は現代のJavaがLALR(1)でもう解析しないのではないかと思います。
しかし、どちらの言語でも、強力なパーサー(または、CとC ++のフロントエンドが現在主に行っているような弱いパーサーとコンテキストコレクションハック)を使用することで、解析の問題を回避できます。CとC ++には、プリプロセッサを使用するという複雑な問題があります。これらは実際には見た目よりも複雑です。1つの主張は、CおよびC ++パーサーは非常に難しいため、手動で作成する必要があるということです。 それは真実ではありません。GLRパーサージェネレーターでJavaおよびC ++パーサーを問題なく構築できます。
しかし、解析は実際には問題ではありません。
解析したら、AST /解析ツリーで何かをしたいと思うでしょう。実際には、すべての識別子について、その定義とその使用場所( "名前と型の解決"、だらしなく、シンボルテーブルの作成)を知る必要があります。これは、継承、インターフェース、オーバーロード、およびテンプレートによって複合されたパーサーを正しく取得するよりもはるかに多くの作業であることがわかります言語標準の。ここでC ++は本当に悪いです。この点から見ると、Java 7と8はかなりひどいものになっています。(そして、シンボルテーブルはあなたが必要とするすべてではありません。「解析後のライフ」についてのより長いエッセイについては私の略歴を参照してください)。
ほとんどの人は純粋な解析部分に苦労しています(多くの場合、決して終了しない。実際の言語に対応するパーサーを構築する方法についての多くの質問についてSO自体を確認してください)。そして、解析が難しいものについての民俗定理が得られ、その段階の後に何が起こるかについてのシグナルはありません。
C ++構文を修正してもどこにも行けません。
C ++構文の変更に関して:多くの場所にパッチを適用して、C ++文法のさまざまなローカルおよび実際のあいまいさを処理する必要があることがわかります。あなたが主張するならば、以下のリストは良い出発点かもしれません。あなたがC ++標準委員会でないなら、これを行う意味がないと私は思います。あなたがそうし、それを使ってコンパイラを構築したとしても、誰もそれを使うことはありません。既存のC ++アプリケーションへの投資が多すぎて、パーサーを作成する人たちの便宜のために切り替えることができません。さらに、彼らの苦痛は終わり、既存のパーサーは正常に動作します。
独自のパーサーを作成することもできます。OK、それは大丈夫です; コミュニティの残りの部分が、あなたが使いやすくするために使用する必要がある言語を変更できると期待しないでください。彼らは皆、彼らにとってより簡単であることを望んでおり、それは文書化され実装された言語を使用することです。