Существует народная теорема, в которой говорится, что С трудно анализировать, а С ++ практически невозможно.
Это не правда.
Что действительно верно, так это то, что C и C ++ довольно трудно анализировать с использованием анализаторов LALR (1) без взлома механизма синтаксического анализа и путаницы в данных таблицы символов. GCC фактически анализировал их, используя YACC и другие подобные хакерские программы, и да, это было ужасно. Теперь GCC использует рукописные парсеры, но все еще с хакерской таблицей символов. Люди Clang никогда не пытались использовать автоматические генераторы парсеров; AFAIK синтаксический анализатор Clang всегда имел рекурсивный спуск с ручным кодированием.
Что правда, так это то, что C и C ++ относительно легко анализировать с более сильными автоматически генерируемыми парсерами, например, GLR-парсеры , и вам не нужны никакие хаки. Парсер Elsa C ++ является одним из примеров этого. Наш C ++ Front End является еще одним (как и все наши интерфейсы «компилятора», GLR - довольно замечательная технология синтаксического анализа).
Наш интерфейс на C ++ не такой быстрый, как GCC, и, конечно, медленнее, чем Elsa; мы потратили немного энергии на его тщательную настройку, потому что у нас есть другие более насущные проблемы (тем не менее, он использовался в миллионах строк кода C ++). Эльза, скорее всего, медленнее, чем GCC просто потому, что она более общая. Учитывая сегодняшние скорости процессора, на практике эти различия могут не иметь большого значения.
Но "настоящие компиляторы", которые широко распространены сегодня, имеют свои корни в компиляторах 10 или 20 лет назад или более. Неэффективности тогда имели гораздо большее значение, и никто не слышал о парсерах GLR, поэтому люди делали то, что они знали, как делать. Clang, конечно, более поздний, но тогда народные теоремы долго сохраняют свою «убедительность».
Тебе больше не нужно так делать. Вы можете очень разумно использовать GLR и другие подобные синтаксические анализаторы в качестве внешних интерфейсов с улучшением удобства сопровождения компилятора.
То, что является верным, заключается в том, что получить грамматику, соответствующую поведению вашего дружественного компилятора соседей, сложно. Хотя практически все компиляторы C ++ реализуют (большую часть) исходного стандарта, они также имеют множество расширений темного угла, например, спецификации DLL в компиляторах MS и т. Д. Если у вас есть сильный механизм синтаксического анализа, вы можете
тратьте свое время, пытаясь привести окончательную грамматику в соответствие с реальностью, а не пытаться согнуть свою грамматику в соответствии с ограничениями вашего генератора синтаксического анализатора.
РЕДАКТИРОВАТЬ Ноябрь 2012: Со времени написания этого ответа мы улучшили наш внешний интерфейс C ++ для обработки полного C ++ 11, включая варианты диалектов ANSI, GNU и MS. Хотя было много лишних вещей, нам не нужно менять наш механизм синтаксического анализа; мы только что пересмотрели правила грамматики. Нам пришлось изменить семантический анализ; C ++ 11 семантически очень сложен, и эта работа затягивает усилия по запуску синтаксического анализатора.
РЕДАКТИРОВАТЬ Февраль 2015: ... теперь обрабатывает полный C ++ 14. (См. , чтобы получить читабельный AST из кода C ++ для GLR-разборов простого бита кода и печально известного "самого неприятного синтаксического анализа" в C ++).
РЕДАКТИРОВАТЬ Апрель 2017: Теперь обрабатывает (черновик) C ++ 17.