GCC neden Bison'dan C ++ ve C için özyinelemeli bir iniş ayrıştırıcısına geçti?


10

Bunu gerektiren bir dil değişikliği oldu mu ya da Bison'un artık uygun ya da optimal olmadığının pratik bir nedeni var mıydı?

Vikipedi'de , GCC 3.4 ve GCC 4.1 sürüm notlarına bakarak değiştirdiklerini gördüm .

Bu sürüm notları şunları ifade eder:

Elle yazılmış özyinelemeli bir C ++ ayrıştırıcı, önceki GCC sürümlerinden YACC'den türetilen C ++ ayrıştırıcısının yerini almıştır. Yeni ayrıştırıcı, C ++ kaynak kodlarının daha iyi ayrıştırılması, uzantıların işlenmesi ve uygun anlambilim analizi ve ayrıştırma arasında temiz ayırma (mümkünse) için gereken çok gelişmiş altyapı içerir. Yeni ayrıştırıcı, eski ayrıştırıcıda bulunan birçok hatayı düzeltir.

Ve:

Eski Bison tabanlı C ve Objective-C ayrıştırıcısının yerini yeni, daha hızlı elle yazılmış özyinelemeli bir ayrıştırıcı aldı

Bilmek istediğim gerçek problemlerin neler olduğu ve Bison kullanarak çözmenin neden imkansız / pratik olmadığıydı.


1
sonuçta tüm ayrıştırıcılar, ayrıştırıcı jeneratör gereksinimleri karşılayamadığında yeterli değişiklikler yapıldıktan sonra homebrewn olur
cırcır ucube

1
Araştırmanızı paylaşmak herkese yardımcı olur . Neyi denediğinizi ve neden ihtiyaçlarınızı karşılamadığını bize bildirin. Bu, kendinize yardım etmeye zaman ayırdığınızı gösterir, bizi açık cevapları tekrar etmekten kurtarır ve en önemlisi daha spesifik ve ilgili bir cevap almanıza yardımcı olur. Ayrıca bkz. Nasıl
Sorulur

1
@gnat Sorumu genişlettim
neelsg

1
C ++, diğer birçok programlama diline kıyasla ayrıştırılacak olağanüstü karmaşık bir dildir. Bağırsak hissim, genel amaçlı bir ayrıştırıcının muhtemelen ev yapımı bir ayrıştırıcının kullanabileceği belirli optimizasyonları destekleyemediğidir.

Yanıtlar:


16

GCC elle yazılmış ayrıştırmaya geçti, çünkü burada açıkladığım gibi özyinelemeli iniş tekniklerini kullanırken hata mesajları daha anlamlı .

Ayrıca, C ++ ayrıştırıcı jeneratörleri kullanmanın bunun için değerli olmadığını ayrıştırmak için böyle (sözdizimsel olarak) karmaşık bir dil haline geliyor.

Sonunda, gerçek bir derleyicinin çalışmalarının büyük kısmı ayrıştırılmıyor, optimize ediyor. GCC orta uç optimizasyon geçişleri ayrıştırılmasından çok daha karmaşıktır.

(BTW GCC'yi örneğin eklentilerle veya MELT kullanarak özelleştirebilirsiniz , ancak nitelikler ve pragmalar eklemek dışında kabul ettiği dilin sözdizimini gerçekten genişletemezsiniz).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.