Parser jeneratörleri de iyi hata üretebilir.
(dalinaum.github.io)Go dili geliştiricisi Russ Cox'un 2010'da yayımladığı yazının çevirisi.
-
yaccgibi sözdizimi üreteçlerinin sözdizimi hatalarını iyi üretemediğine dair bir efsane yayılmıştı. -
Ancak bu sorun Clinton Jeffery'nin 2003'te çözdüğü bir sorundu ve çözmek için parser'ı elle yazmak gerekmiyordu.
-
(
bison) durum ve girdi token'ıyla eşleşen içeriği tabloda bulursanız, basit bir sözdizimi hatasından daha iyi hata mesajları kullanabilirsiniz.
3 yorum
(Aşağıda Kore Rust Discord sunucusunda yazdıklarımı derledim.)
Bu yazının en büyük sorunu, peki Go şu anda parser generator kullanıyor mu sorusu. Hayır. Ana Go parser'ı hâlâ elle yazılmış durumda. Sebebini tam bilmiyorum ama rsc tamam dese bile diğer Go geliştiricilerinin de tamam diye düşünmemiş olma ihtimali yüksek.
Jeffrey'nin fikri, derleyici açısından bakarsak peephole optimizer ile karşılaştırılabilir. Makine kodu üretmeden önce, en son üretilen makine kodu komutlarını sabit sayıda elde tutar (adı da buradan gelir; o pencereye, yani window'a bir delikten peep bakmak gibi) ve belirli bir desen görülürse o noktada ilgili komutu daha hızlı bir komutla değiştirir. Peephole optimizer, diğer genel optimizasyon pass'leriyle birlikte kullanılabilen kullanışlı bir araçtır; ancak yalnızca peephole optimizer ile bir derleyicinin ihtiyaç duyduğu her tür optimizasyonu yapmak mümkün değildir. Aynı şekilde, son token'lardan hata üretme yaklaşımı da tüm parsing hatalarını kapsayamaz. Üstelik bu, özellikle parser generator'a bağlı olmayan, ondan bağımsız biçimde de uygulanabilecek bir yaklaşımdır; dolayısıyla böyle bir yaklaşım var diye parser generator'ların sorunlarının ortadan kalktığını iddia etmek doğru değildir.
Kişisel olarak bence parser generator kavramının kendisi kötü değil; sorun, parser generator'ların "dayattığı" düşünce biçimidir. Parser yazarken, ister üretilmiş ister elle yazılmış olsun, örneğin left recursion ve right recursion'ı hesaba katmak gerekir ve "doğal" dilbilgisini olduğu gibi koda dökemezsiniz. Ama elle yazarken bunu göze alıp yapıyorsunuz; buna karşılık parser generator kullansanız bile LL/LR gibi belirli parsing algoritmalarına bağlı bir "grammar" altkümesine uymak zorundaysanız, generator'ün avantajı yarıya iner. (GLR gibi algoritmalar biraz daha nefes aldırsa da onların da sınırları vardır.) Bugün çoğu production-level dil implementasyonunun parser generator kullanmaması ya da bazen PEG gibi, teknik olarak parser generator olsa da genel generator'ların avantajlarını hiç kullanmayan yaklaşımları tercih etmesinin bir nedeni var.
Parser generator’ların dayattığı dilbilgisi yüzünden onları kullanmak istememeyi anlayabiliyorum; ama bundan parser generator’ların kullanıcıya belirli bir dilbilgisini zorla kabul ettirdiği sonucunu çıkarmak yine de garip geliyor.
Parser generator’lar, lineer zamanlı parse etme avantajına sahip LR dilbilgileri için parsing table üretmenin fazlasıyla zor olması nedeniyle bunu kolaylaştırmak için ortaya çıktı; yoksa parsing’i deterministik olmayan context-sensitive dilbilgiler ya da ne zaman biteceği bile belli olmayan özyinelemeli parser’lar üretmek, parser generator araştırmacılarının/geliştiricilerinin ilgi alanı değildir diye düşünüyorum.
Bu nedenle parser generator’ların sezgisel olmayan LR/LALR dilbilgilerine körü körüne inanan ve bunları dayatan programlar değil, lineer zamanlı parse etme ve bunun için gereken parsing table üretimi gibi son derece zor bir problemi çözen araçlar olarak kendi rollerini gayet iyi yerine getirdiğini düşünüyorum.
Gerçek dünyada görülebilen neredeyse tüm diller LL(1) dilbilgisine sahiptir; bu yüzden LR parser kullanmadan da doğrusal zamanlı parsing mümkündür. (Bu, söz konusu dil için tercih edilen dilbilgisinin LL(1) olduğu anlamına gelmez.) Dolayısıyla doğrusal zamanlı parsing için LR parser kullanmak zorunda olduğumuz, ancak parsing tablosu oluşturmanın zor olması nedeniyle bir generator gerektiği yönündeki ifade neden-sonuç ilişkisini ters çeviriyor. Ayrıca parsing tablosu oluşturma sürecinin kendisi özünde karmaşık değildir (zor olan, algoritmanın ispatıdır).