Modern diller hala çözümleyici jeneratör kullanıyor mu?


38

Bu ortaya çıktığında, burada wikipedia'daki gcc derleyici paketi hakkında araştırma yapıyordum :

GCC, Bison ile üretilen LALR ayrıştırıcılarını kullanmaya başladı, ancak yavaş yavaş elle yazılmış özyinelemeli iniş ayrıştırıcılarına geçti; 2004’te C ++ ve 2006’da C ve Objective-C için. Şu anda tüm ön uçlar el yazısı özyinelemeli iniş ayrıştırıcıları kullanıyor

Bu son cümleye göre (ve wikipedia'ya güvendiğim kadarıyla) Kesinlikle şunu söyleyebilirim: "C (gcc), C ++ (g ++), Amaç-C, Amaç-C ++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Merkür, Modula-2, Modula-3, PL / I, D (gdc) ve VHDL (ghdl) "hepsi, daha uzun bir çözümleyici üreteci kullanın. Yani, hepsi elle yazılmış ayrıştırıcılar kullanıyor.

O zaman sorum şu, bu uygulama her yerde mi var? Spesifik olarak, [Python, Swift, Ruby, Java, Scala, ML, Haskell] içindeki x için "x'in standart / resmi uygulaması elle yazılmış bir çözümleyici var mı?" İçin tam cevaplar arıyorum. (Aslında, diğer dillerle ilgili bilgi de burada açıktır.) Çok sayıda kazıdan sonra bunu kendi başıma bulabileceğime eminim. Ancak bunun toplum tarafından kolayca yanıtlanabileceğinden de eminim. Teşekkürler!


3
Veri noktası: CPython'un bir ev yapımı LALR ayrıştırıcı jeneratörü (kalem) var. Gerisini bilmiyorum.

8
Veri noktası: Ghc (haskell), OCaml'de olduğu gibi, bir LALR ayrıştırma üreteci (mutlu) kullanır.
Twan van Laarhoven

1
"Modern yüksek performanslı derleyicileri yap ..." ya da benzeri bir şey olmalı , çünkü dil bir uygulama değil, bir makine tarafından üretilen ayrıştırıcıyı kullanan ya da kullanmayan bir derleyicidir.
dmckee

@dmckee, evet haklısın. Ancak, adlandırma noktaya daha uzun ve daha az olmaya başlar. Benden daha yaratıcıysanız, düzenlemek için çekinmeyin!
eatonphil

ML ile ilgili olarak: MLton, ML'ye özgü bir ayrıştırma üreteci kullanmaktadır, daha az aşina olmama rağmen, SML / NJ'nin de yaptığı% 90 eminim. Bunu "elle yazılmış" olarak düşünmek isteyebilir veya istemeyebilirsiniz.
Patrick Collins,

Yanıtlar:


34

AFAIK, GCC, özellikle sözdizimsel hata teşhisini geliştirmek için elle yazılmış ayrıştırıcıları kullanır (yani, sözdizimi hataları hakkında insanlara anlamlı mesajlar verir).

Ayrıştırma teorisi (ve ondan çıkan ayrıştırma jeneratörleri) çoğunlukla doğru bir girdi öbeğini tanıma ve ayrıştırma ile ilgilidir . Ancak derleyicilerden anlamlı bir hata mesajı verdiklerini (ve sözdizimsel hatadan sonraki girdilerin geri kalanını anlamlı bir şekilde ayrıştırabileceklerini), bazı yanlış girdiler için bekliyoruz.

Ayrıca, C11 veya C ++ 11- benzeri eski diller (son sürümleri yalnızca üç yaşında olsalar bile kavramsal olarak eskidir) hiçbir bağlamda değildir. Ayrıştırıcı jeneratörler (örneğin bizon veya menhir ) için gramerlerdeki bu bağlam hassasiyetiyle başa çıkmak sıkıcıdır.


2
Hemfikir olmak. Hataların ayrıştırılmasından (ilk hatada ayrıştırmayı durdurmak istemediğinizde, eski bir Borland Pascal'da) iyileşmek ve iyi kalitede hata mesajları oluşturmak (insanların istediği gibi çözüm önerileri ve önerileri dahil) doğal olarak hem bağlamdadır. duyarlı, sezgisel görevler. Bir miktar stok üreteci üreteci üzerine yapılabilir, ancak bu bir slog.
Jonathan Eunice,

2
Dealing with that context sensitiveness in grammars for parser generators is boringly difficult. Ayrıca, bu araçlar bağlamsız ayrıştırıcılar oluşturdukları için neredeyse imkansızdır. İçeriğe duyarlı tüm kısıtlamaların olup olmadığını kontrol etmek için doğru yer, eğer böyle araçlar kullanıyorsanız ayrıştırma ağacını oluşturduktan sonradır .
dtech

7

Ayrıştırma jeneratörleri ve ayrıştırma motorları oldukça geneldir. Genelliğin avantajı, hızlı bir şekilde doğru bir çözümleyici oluşturmanın ve işlevsel hale getirmenin genel şemalarda kolay olmasıdır.

Ayrıştırıcı motorun genelliği nedeniyle performans cephesinde sıkıntı çekiyor. Elle yazılmış herhangi bir kod daima tabloya dayalı çözümleyici motorlardan daha hızlı olacaktır.

Ayrıştırıcı jeneratörlerin / motorların zorlaştığı ikinci alan, tüm gerçek programlama dillerinin, genellikle oldukça ince şekillerde içeriğe duyarlı olmasıdır. LR dilleri bağlamsızdır, yani konumlandırma ve çevre hakkında sözdiziminde uygun şekilde aktarılması imkansız olan birçok incelik vardır. Nitelikli dilbilgileri "kullanımdan önce bildir" vb. Gibi temel dil kurallarını ele almaya çalışır. Bu bağlam duyarlılığını elle yazılmış koda kablolamak oldukça kolaydır.


15
Performans iddiası için alıntı lütfen? Tablo güdümlü olmak önemli bir performans optimizasyonu olabilir ve jeneratörler çok verimli ancak neredeyse hiçbir zaman elle uygulanmayan algoritmalara erişebilirler (tam olarak bunlar, aşılmaz bir tablo ve sihir sayıları karışıklığı nedeniyle).

2
Ve ikinci bölge hakkında: Birçok birçok önemli gerçek programlama dilleri (tüm kümesi başvurmak zorunda kalacak geçerli olan herhangi bir anlamda duyarlı bağlam olmayan geçerli olan tip kontrolü ve böyle sonra programlara asla ne elle yazılmış veya oluşturulan ayrıştırıcı ayrıştırmaya çalışır). Elle yazılmış ayrıştırıcıların daha esnek olduğu doğrudur ve bu bazı diller için yararlıdır, ancak çoğunlukla hata kurtarma ve raporlama, artımlılık, vb. Alanlarında - ayrıştırma jeneratörleri tanıma gücünden dolayı nadiren kaçınır (isterseniz böyle bir gramer yazmak istemek farklı bir hikayedir). -1

Ayrıştırma sırasında sembol tablosu bilgilerini kullanırsanız, bağlam bağlamında duyarlı da diyebilirsiniz. Nitelikli dilbilgileri kesinlikle bağlamsız değildir, ancak tamamen bağlam duyarlı olduklarını sanmıyorum. Hata kurtarma ve raporlama ile ilgili diğer hususlarınız iyi ele alınmıştır.
BobDalgleish

1
C ve C ++, ayrıştırma sırasında sembol tablosu bilgisine ihtiyaç duyar (veya örneğin ifade ifadeleri ve değişken bildirimleri arasında hiçbir ayrım yapılmayan daha az spesifik bir ayrıştırma ağacını kabul eder). Ama ben bunları düşünmedim. Java, Lisps, JavaScript, Ruby, Python, Go, Rust, Scala, Swift, Haskell gibi diller (ve muhtemelen birkaç tane daha, belki C # ve ML? Yine de istiyorum. Birçoğunun gerçekte LL (1) gramerleri ve hatta LALR gramerleri var.

1
Tüm gerçek diller için alıntı lütfen içeriğe duyarlı mı?
psr
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.