Как уже говорили другие, yacc - плохой выбор для реализации синтаксического анализатора C ++ . Можно это сделать; оригинальный GCC сделал это, прежде чем команда GCC почувствовала отвращение к тому, как трудно было поддерживать и расширять. (Flex может быть в качестве лексера).
Некоторые говорят, что парсеры с рекурсивным спуском являются лучшими, потому что так сказал Бьярн Страустроп. Наш опыт показывает, что синтаксический анализ GLR - правильный ответ на этот вопрос, и наш интерфейс на основе GLR *1006* является хорошим доказательством, как и интерфейс Elsa. Наш интерфейс использовался в гневе на миллионах строк C ++ (включая диалекты Microsoft и GCC) для проведения анализа программ и масштабного преобразования исходного кода.
Но недостаточно подчеркивается, что синтаксический анализ - это лишь малая часть того, что требуется для сборки компилятора, особенно для C ++. Вам также необходимо создать таблицы символов («что означает этот идентификатор в этом контексте?») И для этого вам необходимо закодировать практически все несколько сотен страниц стандарта C ++. Мы считаем, что фундамент, на котором мы создаем инструменты, подобные компилятору, DMS , чрезвычайно хорош для этого, и нам потребовался человеко-год, чтобы сделать эту часть правильной.
Но тогда вам нужно рассмотреть остальную часть компилятора:
- Препроцессор
- АСТ строительство
- Семантический анализ и проверка типов
- Управление, поток данных и анализ указателей
- Генерация базового кода
- Оптимизация
- Регистр распределения
- Окончательная генерация кода
- Поддержка отладки
Я продолжаю говорить следующее: создание синтаксического анализатора (часть BNF) для языка похоже на восхождение в предгорьях Гималаев. Создание полного компилятора похоже на восхождение на Эверест. Почти любой ком может сделать первое (хотя C ++ прямо на краю). Только действительно серьезные делают последнее, и только когда очень хорошо подготовлены.
Ожидайте, что сборка C ++ займет у вас годы.
(Внешний интерфейс SD C ++ обрабатывает лексирование, синтаксический анализ, генерацию AST, таблицы символов, некоторую проверку типов и восстановление скомпилированного исходного текста из AST, включая исходные комментарии, для основных диалектов C ++. сроком около 6 лет).
РЕДАКТИРОВАТЬ: май 2015 года. Первоначальный ответ был написан в 2010 году; теперь мы потратили 11 лет, взяв нас на C ++ 14. Дело в том, что создание одного из них - это бесконечные большие усилия.