Dlaczego GCC przeszedł z Bison na rekursywny analizator składni dla C ++ i C?

10

Czy wymagała tego zmiana języka lub jakiś praktyczny powód, dla którego Bison nie był już odpowiedni ani optymalny?

Widziałem na Wikipedii , że się zmieniły, odnosząc się do informacji o wersji GCC 3.4 i GCC 4.1 .

Te informacje o wersji zawierają:

Ręcznie napisany parser C ++ z rekurencyjnym pochodzeniem zastąpił parser C ++ pochodzący z YACC z poprzednich wersji GCC. Nowy analizator składni zawiera znacznie ulepszoną infrastrukturę potrzebną do lepszego parsowania kodów źródłowych C ++, obsługi rozszerzeń i czystego oddzielenia (tam gdzie to możliwe) między właściwą analizą semantyki i parsowaniem. Nowy parser naprawia wiele błędów znalezionych w starym parserze.

I:

Stary parser C i Object-C oparty na Bison został zastąpiony nowym, szybszym odręcznym parserem rekurencyjno-opadającym

Chciałbym wiedzieć, jakie mieli rzeczywiste problemy i dlaczego rozwiązanie Bison było niemożliwe / niepraktyczne

neelsg
źródło
1
w końcu wszystkie parsery zostaną spopielone po wystarczających modyfikacjach, gdy generator parserów nie będzie w stanie sprostać wymaganiom
maniak ratchet
1
Udostępnianie badań pomaga wszystkim . Powiedz nam, co próbowałeś i dlaczego nie spełnia twoich potrzeb. To pokazuje, że poświęciłeś trochę czasu, aby spróbować sobie pomóc, oszczędza nam to powtarzania oczywistych odpowiedzi, a przede wszystkim pomaga uzyskać bardziej konkretną i odpowiednią odpowiedź. Zobacz także How to Ask
gnat
1
@gnat Rozszerzyłem swoje pytanie
neelsg
1
C ++ jest niezwykle złożonym językiem do analizy w porównaniu do większości innych języków programowania. Moje przeczucie jest parserem ogólnego przeznaczenia, który prawdopodobnie nie byłby w stanie wesprzeć pewnych optymalizacji, których mógłby użyć parser warzony w domu.

Odpowiedzi:

16

GCC przeszło na parsowanie odręczne, ponieważ komunikaty o błędach są bardziej znaczące podczas korzystania z technik rekurencyjnych, jak wyjaśniłem tutaj .

Ponadto C ++ staje się tak (syntaktycznie) złożonym językiem do analizowania, że ​​używanie generatorów analizatorów składni nie jest dla niego warte.

W końcu większość pracy prawdziwego kompilatora nie jest analizowana, lecz optymalizowana. Przepustki optymalizacji środkowego końca GCC są znacznie bardziej złożone niż jego analiza.

(BTW możesz dostosować GCC np. Za pomocą wtyczek lub używając MELT , ale tak naprawdę nie możesz tak naprawdę rozszerzyć składni języka, który akceptuje - chyba że dodając atrybuty i pragmy).

Basile Starynkevitch
źródło