Почему GCC переключился с Bison на парсер рекурсивного спуска для C ++ и C?

10

Было ли изменение языка, которое требовало этого, или какая-то практическая причина, по которой Бизон больше не был подходящим или оптимальным?

Я видел в википедии, что они переключились, ссылаясь на примечания к выпуску GCC 3.4 и GCC 4.1 .

Эти примечания к выпуску гласят:

Рукописный синтаксический анализатор C ++ с рекурсивным спуском заменил производный YACC синтаксический анализатор C ++ из предыдущих выпусков GCC. Новый синтаксический анализатор содержит значительно улучшенную инфраструктуру, необходимую для лучшего анализа исходных кодов C ++, обработки расширений и четкого разделения (где это возможно) между надлежащим анализом семантики и анализом. Новый парсер исправляет многие ошибки, найденные в старом парсере.

А также:

Старый синтаксический анализатор C и Objective-C на основе Bison был заменен новым, более быстрым, написанным от руки, парсером рекурсивного спуска

Я хотел бы знать, какие у них были реальные проблемы, и почему было невозможно / нецелесообразно решать с помощью Bison

neelsg
источник
1
в конечном итоге все парсеры станут доморощенными после достаточного количества модификаций, когда генератор парсера не сможет справиться с требованиями
трещотка урод
1
Обмен вашими исследованиями помогает всем . Расскажите нам, что вы пробовали и почему это не соответствует вашим потребностям. Это свидетельствует о том, что вы потратили время, чтобы попытаться помочь себе, избавляет нас от повторения очевидных ответов и, прежде всего, помогает получить более конкретный и актуальный ответ. Также см. Как спросить
Гнат
1
@gnat Я расширил свой вопрос
neelsg
1
C ++ - чрезвычайно сложный для анализа язык по сравнению с большинством других языков программирования. У меня интуитивное чувство, что парсер общего назначения, вероятно, не может поддерживать определенные оптимизации, которые может использовать самодельный парсер.

Ответы:

16

GCC перешел на рукописный анализ, потому что сообщения об ошибках более значимы при использовании методов рекурсивного спуска, как я объяснил здесь .

Кроме того, C ++ становится настолько (синтаксически) сложным языком для анализа, что использование генераторов синтаксических анализаторов для него не стоит.

Наконец, основная часть работы реального компилятора не разбирается, а оптимизируется. Оптимизация промежуточного конца GCC намного сложнее, чем его разбор.

(Кстати, вы можете настроить GCC, например, с помощью плагинов или используя MELT , но вы не можете реально расширить синтаксис языка, который он принимает - кроме как путем добавления атрибутов и прагм).

Василий Старынкевич
источник