Чому GCC перейшов з Bison на рекурсивний аналізатор спуску для C ++ та C?


10

Чи була якась зміна мови, яка цього вимагала, або якась практична причина, чому Бізон вже не був відповідним чи оптимальним?

Я побачив у wikipedia, що вони перейшли, посилаючись на примітки до випуску GCC 3.4 та GCC 4.1 .

У цих примітках до випуску зазначено:

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

І:

Старий аналізатор C і Objective-C на основі зубрів був замінений новим, швидшим написаним вручну рекурсивно-розбірним аналізатором

Що я хотів би знати, це які проблеми були у них і чому неможливо / непрактично вирішити за допомогою Bison


1
врешті-решт всі парсери стануть доморощеними після достатньо модифікацій, коли генератор аналізатора не в змозі впоратися з вимогами
храповик виродка

1
Обмін дослідженнями допомагає всім . Розкажіть, що ви пробували і чому це не відповідало вашим потребам. Це свідчить про те, що ви знайшли час, щоб спробувати допомогти собі, це позбавляє нас від повторення очевидних відповідей, а найбільше це допомагає вам отримати більш конкретну та релевантну відповідь. Також дивіться Як запитувати
gnat

1
@gnat Я розширив своє запитання
neelsg

1
C ++ - надзвичайно складна мова для розбору порівняно з більшістю інших мов програмування. Моє відчуття кишки - це аналізатор загального призначення, напевно, не міг підтримати певних оптимізацій, якими може скористатися домашній аналізатор.

Відповіді:


16

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

Крім того, C ++ стає такою (синтаксично) складною мовою для розбору, що використовувати генератори парсера не варто для цього.

Нарешті, основна частина роботи реального компілятора не розбирається, це оптимізує. Проходи оптимізації середнього рівня GCC набагато складніші, ніж його аналіз.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.