Было ли изменение языка, которое требовало этого, или какая-то практическая причина, по которой Бизон больше не был подходящим или оптимальным?
Я видел в википедии, что они переключились, ссылаясь на примечания к выпуску GCC 3.4 и GCC 4.1 .
Эти примечания к выпуску гласят:
Рукописный синтаксический анализатор C ++ с рекурсивным спуском заменил производный YACC синтаксический анализатор C ++ из предыдущих выпусков GCC. Новый синтаксический анализатор содержит значительно улучшенную инфраструктуру, необходимую для лучшего анализа исходных кодов C ++, обработки расширений и четкого разделения (где это возможно) между надлежащим анализом семантики и анализом. Новый парсер исправляет многие ошибки, найденные в старом парсере.
А также:
Старый синтаксический анализатор C и Objective-C на основе Bison был заменен новым, более быстрым, написанным от руки, парсером рекурсивного спуска
Я хотел бы знать, какие у них были реальные проблемы, и почему было невозможно / нецелесообразно решать с помощью Bison
Ответы:
GCC перешел на рукописный анализ, потому что сообщения об ошибках более значимы при использовании методов рекурсивного спуска, как я объяснил здесь .
Кроме того, C ++ становится настолько (синтаксически) сложным языком для анализа, что использование генераторов синтаксических анализаторов для него не стоит.
Наконец, основная часть работы реального компилятора не разбирается, а оптимизируется. Оптимизация промежуточного конца GCC намного сложнее, чем его разбор.
(Кстати, вы можете настроить GCC, например, с помощью плагинов или используя MELT , но вы не можете реально расширить синтаксис языка, который он принимает - кроме как путем добавления атрибутов и прагм).
источник