LL ve LR ayrıştırmanın başlıca avantajları ve dezavantajları nelerdir?


27

Bir programlama diline ayrıştırıcı oluştururken ne kazanacağımı, birini veya diğerini seçerek neyi kaybettim?


“LL ayrıştırıcı” ve “özyinelemeli iniş ayrıştırıcı” iki ayrı şey değil midir? LL (k) gramerlerinin bir RD ayrıştırıcısı kullanılarak ayrıştırılabileceği anlaşılmaktadır, ancak bu LL ayrıştırıcılarının RD ayrıştırıcılarla aynı olduğu anlamına gelmez . Durum bu mu? Bakınız: stackoverflow.com/questions/1044600/…
xji

@XiangJi: Bunlar çok farklı her LL dilbilgisi RD ayrıştırıcı eşlenebilir ki, ama ters (RD Ayrıştırıcıları alternatifleri beri mutlaka tutun değil sipariş ve LL dilbilgisi olanlardır sırasız ).
Tim,

Yanıtlar:


42

LL ve LR ayrıştırma işlemlerini bir dizi kriter için karşılaştıracağım:

karmaşa

LL burada kazanır, eller aşağı. LL ayrıştırıcısını kolayca elle yazabilirsiniz. Aslında bu yaygın yapılır: Microsoft C # derleyicisi bir elle yazılmış özyinelemeli iniş ayrıştırıcısıdır (kaynağını burada Patrick Kristiansen tarafından yapılan bir yorum için göz - blog yazısı çok yanı ilginç olan).

LR ayrıştırma, bir metni ayrıştırmak için oldukça sezgisel bir yöntem kullanır. Çalışıyor ama başımı tam olarak nasıl çalıştığıyla dolaştırmam biraz zaman aldı. Bu nedenle, böyle bir ayrıştırıcıyı elle yazmak zordur: Bir LR ayrıştırma-üretecini az ya da çok uygularsınız.

genellik

Burada LR kazanır: tüm LL dilleri LR dilidir, ancak LL dilden daha fazla LR dili vardır (eğer bir LL ayrıştırıcı ile ayrıştırılabilirse bir LL dili ve ayrıştırılabilirse bir dil LR dilidir) bir LR ayrıştırıcısı).

LL epeyce sıkıntılar vardır edecek herhangi bir programlama dili hakkında uygularken sizi rahatsız. Genel bir bakış için buraya bakınız .

LR dili olmayan belirgin diller var, ancak bunlar oldukça nadir. Neredeyse hiç böyle dillerle karşılaşmıyorsunuz. Ancak, LALR'nin birkaç sorunu var.

LALR, LR ayrıştırıcılarının tabloları küçültmesi için aşağı yukarı bir kesmektir. Bir LR ayrıştırıcısının tabloları tipik olarak çok büyük olabilir. LALR ayrıştırıcıları, tüm LR dillerini daha küçük tablolar karşılığında ayrıştırma yeteneğinden vazgeçer. Çoğu LR ayrıştırıcısı aslında LALR kullanır (gizlice değil, genellikle tam olarak ne yaptığını bulabilirsiniz).

LALR, vardiya azaltma ve azaltma - azaltma çatışmalarından şikayetçi olabilir. Bu, hack tablosundan kaynaklanır: benzer girişleri birbirine 'katlar', bu da işe yarıyor, çünkü çoğu giriş boş, ancak boş olmadıklarında bir çatışma ortaya çıkıyor. Bu tür hatalar doğal değildir, anlaşılması zor ve düzeltmeler genellikle oldukça gariptir.

Derleyici hataları ve hata kurtarma

LL burada kazanır. Bir LL ayrıştırmada, özellikle elle yazılmış ayrıştırıcılarda, yararlı derleyici hataları çıkarmak genellikle oldukça kolaydır. Bundan sonra ne beklediğinizi biliyorsunuz, bu yüzden ortaya çıkmazsa, genellikle neyin yanlış gittiğini ve en mantıklı hatanın ne olacağını bilirsiniz.

Ayrıca, LL ayrıştırmada hata kurtarma çok daha kolaydır. Bir giriş doğru şekilde ayrılmazsa, biraz ileri atlayıp girişin geri kalanının doğru şekilde ayrılıp ayrılmadığını anlamaya çalışabilirsiniz. Örneğin, bir programlama ifadesi hatalı biçimlendirilmişse, ileri atlayıp bir sonraki ifadeyi ayrıştırır, böylece birden fazla hatayı yakalayabilirsiniz.

Bir LR ayrıştırıcısı kullanmak bu çok daha zordur. Dilbilginizi artırmayı deneyebilirsiniz, böylece hatalı girişleri kabul eder ve yanlış giden alanlardaki hataları yazdırır, ancak bunu yapmak oldukça zordur. LR olmayan (veya LALR olmayan) bir gramer ile sonuçlanma şansınız da artar.

hız

Hız, girişinizi (LL veya LR) ayrıştırma biçiminizle ilgili bir sorun değil, sonuçta ortaya çıkan kodun kalitesi ve tabloların kullanımı (LL ve LR için tabloları kullanabilirsiniz). LL ve LR bu nedenle bu açıdan karşılaştırılabilir.

Bağlantılar

Burada ayrıca LL ve LR ile zıt olan bir siteye bir link var. Alt kısımdaki bölümü arayın.

Burada farklılıklar ile ilgili bir konuşma bulabilirsiniz. Orada dile getirilen fikirlere eleştirel bir gözle bakmak kötü bir fikir değil, orada devam eden kutsal bir savaş var.

Daha fazla bilgi için, burada ve burada , ayrıştırıcılar hakkında kendi yazdıklarımdan ikisi var, ancak LL ve LR arasındaki kontrast ile ilgili değiller.

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.