Існує народна теорема, яка говорить, що C важко проаналізувати, а C ++ по суті неможливо.
Це неправда.
Правда полягає в тому, що C та C ++ досить важко проаналізувати за допомогою синтаксичних аналізаторів LALR (1) без злому механізму синтаксичного аналізу та заплутування даних таблиці символів. GCC фактично використовував їх синтаксичний аналіз, використовуючи YACC та додаткові хакерські атаки, як це, і так, це було потворно. Зараз GCC використовує рукописні синтаксичні аналізатори, але все ще з хакерською таблицею символів. Люди Клангу ніколи не намагалися використовувати автоматизовані генератори синтаксичного аналізатора; Парсер AFAIK Clang завжди мав ручне кодування рекурсивного спуску.
Що правда, це те, що C і C ++ порівняно легко аналізувати з сильнішими автоматично створеними синтаксичними аналізаторами, наприклад, парсерами GLR , і вам не потрібні будь-які хаки. У Ельзі C ++ аналізатора є одним з прикладів цього. Наш інтерфейс C ++ інтерфейс - інший (як і всі наші інтерфейси нашого «компілятора», GLR - це чудова технологія синтаксичного аналізу).
Наш інтерфейс C ++ не такий швидкий, як GCC, і, звичайно, повільніший, ніж Elsa; ми витратили мало енергії на його ретельну настройку, оскільки у нас є інші більш актуальні проблеми (тим не менше, це було використано на мільйонах рядків коду на C ++). Ельза, швидше за все, повільніша за GCC просто тому, що є більш загальною. Враховуючи сьогоднішню швидкість процесора, ці відмінності можуть не мати великого значення на практиці.
Але "справжні компілятори", які широко розповсюджені сьогодні, сягають своїм корінням у компілятори 10 або 20 років тому чи більше. Тоді неефективність мала набагато більше значення, і ніхто не чув про парсери GLR, тож люди робили те, що вміли робити. Кленг, звичайно, нещодавніший, але тоді народні теореми довго зберігають свою "переконливість".
Вам більше не потрібно робити так. Ви можете дуже розумно використовувати GLR та інші подібні аналізатори, як інтерфейси, з поліпшенням ремонтопридатності компілятора.
Що це правда, що отримання граматика , яка відповідає поведінці вашого дружнього сусідства компілятора важко. Хоча практично всі компілятори C ++ реалізують (більшість) оригінального стандарту, вони, як правило, мають безліч темних розширень, наприклад, специфікації DLL у компіляторах MS тощо. Якщо у вас сильний механізм синтаксичного аналізу, ви можете витратити свій час, намагаючись отримати останню граматику, щоб відповідати дійсності, а не намагатися зігнути свою граматику відповідно до обмежень генератора синтаксичного аналізатора.
EDIT листопад 2012: З моменту написання цієї відповіді ми вдосконалили наш інтерфейс C ++, щоб обробляти повний C ++ 11, включаючи діалекти ANSI, GNU та MS. Незважаючи на те, що було багато зайвих речей, нам не потрібно міняти наш механізм синтаксичного аналізу; ми щойно переглянули граматичні правила. Ми ж повинні змінити семантичний аналіз; C ++ 11 семантично дуже складний, і ця робота загрожує зусиллями для запуску парсера.
EDIT лютого 2015: ... тепер обробляє повний C ++ 14. (Див. Отримання людсько зрозумілого AST із коду c ++ для розбору GLR простого біта коду та сумнозвісний "найбільш неприємний синтаксичний розбір" C ++).
EDIT квітень 2017: Тепер обробляє (чернетка) C ++ 17.