En güçlü ayrıştırıcı nedir?


28

Yan proje olarak Python'u kullanarak bir dil yazıyorum. Ply adında bir esnek / bizon klonu kullanmaya başladım, ancak bu dilbilgisi tarzında ifade edebileceğim gücün kenarlarına karşı geliyorum ve empedans uyumsuzluğu nedeniyle dilimi kırmakla ilgilenmiyorum alet. Bu nedenle, kendiminkini yazma konusunda hevesli değilim

Peki en güçlü çözümleyici türü nedir? Makalelere yapılan atıflar (ve daha fazla tanıtım makalesi gibi) memnuniyetle karşılanacaktır.

('Güçlü' nin kesin olarak tanımlanmadığını biliyorum, ama onunla biraz serbest kalacağız ve cevapların nereye gittiğini görelim)


1
Aşağı oy verildi: araştırma düzeyi değil.
Warren Schudy

3
@Warren: Sormadan önce SSS bölümünü kontrol ettim - bu bir zorunluluk gibi görünmüyor.
Paul Biggar

1
Biri genel site için ve diğeri CStheory için iki tane SSS var. CStheory, Vikipedi okuyarak cevaplanabilecek soruların konu dışı olduğunu; bkz. "Ne tür sorular çok basit?" içinde meta.cstheory.stackexchange.com/questions/225/... .
Warren Schudy

1
@Warren: Okuduğum SSS. Vikipedi'yi okudum ama bunun gerekli bir içgörü olduğunu hissettim.
Paul Biggar

1
Yani, üretimde ortak veya teorik olanlar, yani CFG dışındaki gramer türlerini kapsayanlar mı?
Raphael

Yanıtlar:


33

Bir gramer genellikle olarak tanımlanır Bağlam Ücretsiz dilbilgisi kesin tanım Vikipedi sayfasında verilmektedir, ancak dayanmaktadır PLY, olduğu gibi aynı işleri - Bison sırayla dayanmaktadır, yacc .

Burada PLY'nin bir LALR ayrıştırıcısı kullandığı yazıyor . Bu esas olarak bir olduğunu LR ayrıştırıcı arama tabloları muhtemelen (yani, bir LR ayrıştırıcı bir bağlam bağımsız dilbilgisi ayrıştırabilir), ayrıştırma çakışmaları sokulması LR gramer anlamlılık bir indirgeyici, kondense edilir. Eğer ayrıştırıcıları Bu kolun sınırlamalar ve diğer ayrıştırıcıları olanlar hakkında bilmek istiyorsanız, ayrıştırma teknikleri (LL, LR ve diğerleri) her türlü bir bakış verilir burada .

Sorunuzu cevaplamak için: dil belirsiz olsa da herhangi bir bağlamsız dili ayrıştırma yeteneğine sahip ayrıştırma algoritmaları var (örneğin, girişi yorumlamanın birden fazla yolu var):

O(n3|G|)n|G|

O(n3)O(n2)

Burada , Earley algoritmasının pratik bir uygulamasını (bir uyarlamasını) tartışan bir makale bulabilirsiniz. Sonuca varıyorlar: "Earley ayrıştırmanın LALR (1) ayrıştırmaya göre genelliği göz önüne alındığında ((kabaca PLY'nin yaptığı)) ve PEP'lerin bile ((Earley algoritmasını uyguladıkları)) en kötü zamanın dikkate alınmayacağını düşünerek kullanıcı, bu mükemmel bir sonuç. "

Son ayrıştırıcı türü GLR ayrıştırıcısıdır . Bu, bağlamsız bir dili ayrıştırma yeteneğine sahip LR ayrıştırmanın genelleştirilmiş bir sürümüdür.

GLR'nin olgun bir uygulaması ASF + SDF'dir . Bison, bir GLR ayrıştırıcısı da üretebilir, ancak uygulamaları 'standart' GLR algoritmasından biraz farklıdır. Elkhound algoritması bir GLR / LALR hibrid algoritmasıdır. Herhangi bir grameri hem hızlı hem de ayrıştırma yeteneğine sahip olmak için mümkün olduğunda LALR ve gerektiğinde GLR kullanır.

Bağlamsız dilbilgilerinin ötesinde, içeriğe duyarlı dilbilgileri vardır , ancak bunlar genel olarak ayrıştırılması zordur ve çok fazla ifade katmazlar: ayrıştırmadıkça onlarla daha fazlasını yapabilirsiniz; doğal bir dil.

Son adım olarak sınırsız gramerler var . Bu noktada dilbilgisi Turing tamamlandı, bu nedenle çoğu ayrıştırma uygulamasında istenmeyen belirli bir dili ayrıştırmanın ne kadar süreceği konusunda verilebilecek bir sınır yok. Ekstra güç neredeyse hiç gerekli değildir. Tüm bu gücü kullanmak istiyorsan, mevcut dil makinesi var.

Son olarak, kendi çözümleyici jeneratörünüzü uygulamak, özellikle hızlı olması için önemsiz bir mesele değildir. Şahsen kendi esnek versiyonumu (lexer generator) yapmayı bitirdim ve bu nispeten basit algoritmik problemlerde bir egzersiz gibi görünse de, özellikle Unicode'u desteklemeye çalıştığımda, doğru olmak oldukça karmaşık bir hal aldı. Kendinizinkini yazmak yerine önceden var olan bir uygulamayı kullanmayı düşünün.


1
Mükemmel cevap !! PEG'lerin nasıl uyduğuna dair bir fikriniz var mı?
Paul Biggar

2
PEG'ler CFG'lerden “farklı” dır: PEG olmayan CFG'ler vardır ve bunun tersi de geçerlidir. Seni buraya yönlendiririm: stackoverflow.com/questions/1857022/… .
Alex ten Brink,


1
Aslında, en yaygın ayrıştırıcı üreteçleri (yacc, Antlr, bizon), CF olmayan kavramlara, bir kuralın uygulanıp uygulanmadığını kontrol eden tahminler veya rastgele kodlar aracılığıyla izin verir. öncelik verme. Bu, statik anlambilimi uygulamak için kullanılabilir, çünkü temel sözdizimi özünde içeriksiz kalır.
Raphael

1
Özyinelemeli diller kesin olarak Turing Makineleri'ni her zaman durduran diller. Bu nedenle herhangi bir içeriğe duyarlı dil de özyinelemelidir, ancak içeriğe duyarlı diller üstel zaman içinde belirlenebilir olduğundan, içeriğe duyarlı olmayan özyinelemeli diller vardır. Sınırsız dilbilgisi daha da güçlü: durma sorunu sınırsız bir dilbilgisi ile tanımlanabilir, ancak özyinelemeli bir dil değildir.
Alex ten Brink,

15

ICFP 2010'da bu yılki Toplam Ayrıştırıcı Birleştiricileri makalesinde, kesin olarak sonlandırılan bir ayrıştırıcı kitaplığı kitaplığı açıklanmaktadır ve ayrıca ayrıştırıcının sonlandırılması garanti edildiğinde , bu kitapçıkta "ayrıştırıcı birleştiricilerin mümkün olduğu kadar açıklayıcı" olduğunu belirtir. Ne yazık ki, yazarın "mümkün olduğu kadar ifade edici" nin ne anlama geldiğinin açıklamasını hatırlamıyorum, ama kesinlikle "güç" hakkındaki sorunuzla alakalı görünüyor.


1
Kirletmeyen bir arabam var, Aslında ikisi de hareket etmiyor ... Asıl soru şu: Bu kütüphane tarafından ne tür bir dil ayrıştırılıyor? Elbette bu işin ilginç olmadığı anlamına gelmez.
babou,

2

Programlama dillerini ayrıştırmak için bağlamsız dilbilgilerinin ötesine geçmek, ancak yine de polinom zamanlarında ayrıştırmak istiyorsanız, ifade dilbilgilerini veya boolean dilbilgilerini ayrıştırmaya başvurabilirsiniz - ikincisi LL ve LR lezzetlerinde de bulunabilir ( buraya bakın ). Biçimsel dil teorisinde, aynı zamanda güçlü ancak doğrusal zamanla tanınabilir Church-Rosser dilleri de incelenmiştir, ancak bunlar için uygulanan herhangi bir ayrıştırıcı üreticisinin farkında değilim.

Doğal dil işlemede, zevkler farklıdır, örneğin belirsizlikle (ayrıca: doğal belirsizlikle) başa çıkmak ve ücretsiz kelime sırası çok belirgin bir rol oynamaktadır. Buradaki anahtar kelimeler ılımlı bağlamda hassas dilleri ve yeniden başlatma otomatlarını okumaya başlamanıza yardımcı olabilir.


1
Sorunun sorulma şekli ve CF'nin çok kısıtlayıcı olduğu şikayeti göz önüne alındığında, cevabınız kesinlikle en iyisidir. Yani gidiyor ...
babou

0

Ayrıştırıcı Jeneratör Araçları:

ANTLR çok iyi. Alternatif olarak, JavaCC'ye bakabilirsiniz


Ben bir bilgisayar bilimcisi değilim (derecem dediğine rağmen); bu yüzden sözlerim burada hafifçe ağır olabilir. Sazzad ile aynı fikirdeyim - ANTLR çok güçlü bir araçtır. Çok tamamlandı ve çözümleyici üreteciyle ilgili herhangi bir sorun bulamadım (doğru hatırlıyorsam) (LL (k)). Öte yandan, daha karmaşık bir gramer için bir derleyici henüz uygulamadım ...
Jörgen Sigvardsson 19

5
Sanırım sorunun noktasını ve belki de tüm siteyi kaçırıyorsunuz. Uygulama ve araçlarla değil, ayrıştırma teorisi ile ilgilidir.
Paul Biggar
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.