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
Odpowiedzi:
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).
źródło