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