Розбір C ++ стає важким. Розбір Java стає настільки ж важким.
Дивіться цю відповідь SO, де обговорюється, чому C (і C ++) "важко" аналізувати . Короткий підсумок полягає в тому, що граматики C і C ++ по своїй суті неоднозначні; вони дадуть вам кілька аналізів, і ви повинні використовувати контекст, щоб вирішити неясності. Тоді люди роблять помилку, вважаючи, що вам доведеться вирішувати двозначності під час розбору; не так, див. нижче. Якщо ви наполягаєте на вирішенні двозначностей під час синтаксичного аналізу, ваш парсер ускладнюється і набагато важче будується; але ця складність - це самонанесення рани.
«Очевидна» граматика LALR (1) IIRC, Java 1.4 не була однозначною, тому її було легко «проаналізувати». Я не настільки впевнений, що сучасна Java не має принаймні місцевих двозначностей; Завжди існує проблема вирішення питання, чи закриває "... >>" два шаблони, чи "оператор зрушення вправо". Я підозрюю, що сучасна Java більше не аналізує LALR (1) .
Але можна обійти проблему синтаксичного аналізу, використовуючи сильні синтаксичні аналізатори (або слабкі синтаксичні аналізатори та збір контекстних колекцій, як це в основному зараз роблять інтерфейси C та C ++), для обох мов. C та C ++ мають додаткове ускладнення - наявність препроцесора; вони на практиці складніші, ніж здаються. Одне з тверджень полягає в тому, що парсери C і C ++ настільки важкі, що їх доводиться писати від руки. Це неправда; Ви можете чудово створювати парсери Java і C ++ за допомогою генераторів синтаксичного аналізу GLR.
Але синтаксичний розбір насправді не є проблемою.
Після аналізу ви захочете щось зробити з деревом AST / синтаксичного аналізу. На практиці для кожного ідентифікатора потрібно знати, що таке його визначення та де він використовується («дозвіл імені та типу», неохайно, побудова таблиць символів). Це виявляється набагато більшою роботою, ніж отримання правильного аналізатора, що складається з успадкування, інтерфейсів, перевантаження та шаблонів, і збентежений тим фактом, що семантика всього цього написана неформальною природною мовою, розповсюдженою на десятках і сотнях сторінок мовного стандарту. С ++ тут дуже поганий. Java 7 і 8 стають досить жахливими з цієї точки зору. (І таблиці символів - це не все, що вам потрібно; перегляньте мою біографію для більш довгого нарису на тему "Життя після розбору").
Більшість людей борються з чистою частиною синтаксичного аналізу (часто ніколи не закінчуючи; перевірте сам SO на багато-багато питань щодо того, як створити робочий синтаксичний аналізатор для справжніх мов), тому вони ніколи не бачать життя після синтаксичного аналізу. І тоді ми отримуємо народні теореми про те, що важко проаналізувати, і жодного сигналу про те, що відбувається після цього етапу.
Виправлення синтаксису C ++ нікуди не дійде.
Щодо зміни синтаксису C ++: вам виявиться, що вам потрібно залатати багато місць, щоб подбати про різноманітність локальних та реальних неоднозначностей у будь-якій граматиці C ++. Якщо ви наполягаєте, наступний список може бути хорошим початковим місцем . Я стверджую, що немає сенсу робити це, якщо ви не є комітетом зі стандартів C ++; якби ви зробили це і створили компілятор, використовуючи це, ніхто розумний не використовував би його. Занадто багато вкладено в існуючі програми на C ++, щоб їх можна було переключити для зручності хлопців, які будують парсери; крім того, їх біль закінчився, і існуючі парсери працюють нормально.
Можливо, ви захочете написати власний парсер. Добре, це нормально; просто не чекайте, що решта спільноти дозволить вам змінити мову, якою вони повинні користуватися, щоб вам було легше. Всі вони хочуть, щоб їм було простіше, і це використовувати мову, як задокументовано та реалізовано.