SORU
25 HAZİRAN 2009, PERŞEMBE


Bir LL arasındaki fark ve Özyinelemeli Kökenli ayrıştırıcı?

Son zamanlarda ayrıştırıcıları (bağlam-ücretsiz gramer/dil iş kendimi nasıl öğretmek için çalışıyor olmak ve en mantıklı bir şey yapıyor gibi. Özellikle dikkatimi odaklıyorumLL(k) gramerleriiki ana algoritmaları LL parser (yığın/ayrıştırma tablo kullanarak) Recursive Descent parser (sadece özyineleme kullanarak) gibi görünüyor.

Görebildiğim kadarıyla, özyinelemeli iniş algoritması tüm LL(k) gramerleri üzerinde LL(k) gramerleri ve muhtemelen, bir LL ayrıştırıcı fazla ise eserler üzerinde çalışır. Bir özyinelemeli kökenli ayrıştırıcı açıkça uygulamaya LL ayrıştırıcı çok daha basit, ancak bir LL sadece bir LR birden olması durumunda olduğu gibi).

Benim sorum, bu avantajları bir algoritma ya da kullanırken karşılaşabileceğiniz sorunlar nelerdir? Neden hiç gramerleri aynı sette çalıştığını ve uygulamak için zor olduğu göz önüne alındığında özyinelemeli iniş üzerinde LL pick olabilir mi?

Umarım bu sorunun mantıklı bir miktar yapar. Eğer bana ... benim bütün bu konu neredeyse tamamen yeni olmasından suçu değil üzgünüm.

CEVAP
25 HAZİRAN 2009, PERŞEMBE


LL genellikle özyinelemeli-iniş daha verimli bir ayrıştırma tekniğidir. Aslında, özyinelemeli-iniş naif bir çözümleyici aslındaO(k)^n)(buradangiriş boyutu) en kötü durumda. Memoization gibi bazı teknikleri Packrat bir çözümleyici verir () bu geliştirmek yanı sıra gramer çözümleyici tarafından kabul sınıfını genişletmek olabilir, ama her zaman alan bir bedeli var. LL ayrıştırıcıları (bildiğim kadarıyla) her zaman doğrusal zaman.

Kapak tarafında, özyinelemeli-iniş ayrıştırıcıları LL daha gramerleri daha büyük bir sınıf işleyebilir sezgilerinizi doğru. Özyinelemeli-iniş LL (*) (. herhangi bir gramer işleyebilir ^em>sınırsızileri yönlü) belirsiz gramerleri de küçük bir set. Bu özyinelemeli-iniş aslında Mandal doğrudan kodlanmış bir uygulama olduğu için, ya da Parser Expression Grammar(s). Özellikle, bölücü operatörü (a | b) değişmeli, a | b b | a eşit değildir anlamına gelir. Özyinelemeli-iniş ayrıştırıcı bir sırayla her bir alternatif çalışacağız. Eğer öyleyse a giriş eşleşirse, b bile succedeolurdugiriş eşleşti. Bu klasik "uzun" belirsizlikleri ** 5 sarkan sorun sadece sipariş disjunctions tarafından doğru olarak ele alınması gibi maç sağlar

Bütün bu " dedimümkünbir LL(k) uygulamak için doğrusal zamanda çalışır özyinelemeli-iniş ayrıştırıcı kullanarak. Bu her ayrıştırma rutin, sürekli belirli bir giriş için uygun üretim belirler böylece aslında satır içi uygulaması tahmin takımları tarafından yapılır. Ne yazık ki, böyle bir tekniği ele olmaktan gramerleri bütün bir sınıf ortadan kaldırır. Akıllı ayrıştırma konuşmaya başladıktan sonra, else sarkan gibi sorunlar artık böyle kolaylıkla çözülebilir.

LL özyinelemeli-iniş üzerinde seçilmiş olurdu neden olarak, başta verimlilik ve sürdürülebilirlik meselesi. -Özyinelemeli iniş ayrıştırıcıları uygulamak için belirgin bir şekilde daha kolay olur, ama temsil ettikleri dilbilgisi herhangi bir bildirim formu mevcut olduğundan genellikle korumak zordur. En kullanım durumları ANTLR veya Bizon gibi ayrıştırıcı jeneratör istihdam çözümleyici-önemsiz olmayan. Bu araçları ile, gerçekten eğer algoritma doğrudan kodlanmış özyinelemeli-iniş ya da tablo odaklı, önemsİzdİr LL(k).

Faiz meselesi olarak, aynı zamanda bir ayrıştırma algoritması doğrudan özyinelemeli-iniş moda sonra kodlanmış olan recursive-ascent, araştırmaya değer, ama herhangi bir LALR dilbilgisi işleme yeteneğine sahiptir. Ayrıca özyinelemeli-iniş ayrıştırıcıları birlikte yazmanın işlevsel bir yoldur parser combinators, incelerim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • filmurfreakur

    filmurfreaku

    29 Mart 2007
  • ICON

    ICON

    19 EKİM 2011
  • RealPapaPit

    RealPapaPit

    16 Mart 2009