2012-04-23 17 views
7

Ben kullanıcı bağlamı/tarih ve bilginin karşı onları değerlendirerek ayrıştırma ormandan belirsiz bir gramer (orman ayrıştırmak) tüm olası ayrıştırma sonuçları döndürmek ve seçme ayrıştırıcı almaya çalışıyorum tabanı. Performans nedeni için, bu muhtemelen, sonsuz döngülerden kaçınmak için üretim kurallarının uygulanmasında özyinelemeli çağrıların sayısını sınırlamak için, paket çözümleyici ve bir arama sınırı/üst sınır parametresi ile yapılmalıdır.Scala Ayrıştırıcı Combinator, Belirsiz Gramer ve Ayrıştırma Orman

Hem Scala hem de Ayrıştırıcı Kombinatörlerinde yeni olmak için, bunun nasıl yapılacağını veya herhangi bir şekilde yapılıp yapılamayacağını anlayamıyorum. Birisi yardım edebilir mi? Çok takdir edildi.

Saygılarımızla, Thomas Juan

cevap

10

Sen ile bunu yapamaz Scala yerleşik ayrıştırıcı, bağdaştırıcılarla. Packrat kombinatorleri sadece kesin olmayan dilbilgisi ile sınırlıdır. Belirsizlikle uğraşmaya çalışırsanız, anı yazma yeteneğini kaybedersiniz ve ayrıştırma parkurları için bile karmaşıklığı O (k^n) olur. Öyleyse yapma.

İstediğiniz, belirsizliği doğru şekilde işleyen bir çözümleyici birleştirme çerçevesidir. Bildiğim kadarıyla, Scala'nın tek çerçevesi benim GLL combinators'dur. Sözdizimi hemen hemen Scala'nın ayrıştırıcı birleştiricileriyle aynıdır (ana farklılık, yüksek-işlev işlevlerinin doğru şekilde çalışır), ancak çıktı, Stream[A], burada A sonuç türüdür. Böylece, bir ayrıştırma ormanı alırsınız. Sonuç aslında bir SPPF (paylaşılan paketlenmiş ayrıştırma ormanı) olmadığına dikkat edin, bu nedenle üstel bir sonuç sayısı üretirseniz, akış orantısal boyutta olacaktır. Bu sonuç türünde nihai esnekliği korumak için yapıldı.

GLL birleştiricileri O (n^3) en kötü durumunda, patolojik olarak belirsiz gramerler için bile. Ortalama durumda, ayrıştırma izinin kesin olmadığı yerde, GLL birleştiricileri O (n) 'dir. Sabit zaman ek yükü şu anda biraz fazladır, ancak optimizasyon devam eden bir projedir. GLL kombinatorlerini Precog numaralı ürünlerde kullanıyoruz, böylece kütüphanenin ileriye dönük olarak iyi bakılmasını bekleyebilirsiniz.

+0

İçgörü için teşekkürler. Fikirlerimi keşfetmek, ben dilbilgisi onarmak için nereye bana gösterebilir arızaları ayrıştırmak gerçekleştirmek ve kullanıcıya çözüm seçenekleri, bu bilgi veya onlar gibi başarısız ayrıştırma girişimleri için bir "puan" korumak için GLL combinators mümkündür denendi? Çok beğeni! –

+0

Ayrıca, bu ekstra davranış ayrıştırıcıyı her zaman en kötü durumdaki O (n^3) karmaşıklığı üretmeye zorlar mı? –

İlgili konular