Bir dize ve bir CFG verildiğinde, dizeyi hangi karakterler izleyebilir (CFG'nin duygusal formlarında)?


10

Let terminali ve kümesi , bazı serbest içerik terminal olmayan semboller grubu .N GΣNG

Diyelim ki dizgim var ki xay \ in \ mathcal {S} (G) burada x, y \ in (\ Sigma \ cup N) ^ * ve \ mathcal {S } (G) arasında tümce formlarıdır G . x a y S ( G ) x , y ( Σ N ) S ( G ) Ga(ΣN)+xayS(G)x,y(ΣN)S(G)G

verildiğinde , bir set .C = { b w a b z S ( G ) , b Σ N }GC={bwabzS(G),bΣN}

Açıklığa kavuşturmak için, bu durumda, , terminal dizeleri ve terminal olmayan dizilerdir ve , bir uzunluktadır.bw,x,y,z,a,bb

Ben eğer bunu nasıl görebilirsiniz uzunluğa biri de; her , aşağıdaki (terminal olmayanlar dahil) setinin bir üyesidir .aba

Ancak, bir dizi karakter için mümkün olup olmadığını merak ediyorum. Uygulamam için, dizesi , prodüksiyonların sağ tarafından daha uzun değil .aG

Terminaller ile terminal olmayanlar arasındaki ayrım benim uygulamamda sessizdir çünkü üretken bir dilbilgisi kullanıyorum; ve bir uzunluk olduğu için bunun çok fazla sorun yaratmayacağına inanıyorum .b


1
Başvurunuz nedir? Bir ayrıştırıcı mı inşa ediyorsunuz?
Raphael

Dilbilgisinin normal bir biçimde olduğunu varsayabilir miyiz veya keyfi olanlar için çalışması gerekir mi?
Raphael

@AlextenBrink - ve y rastgele dizelerdir. Sadece bir parçaya / alt dizeye bakıyorum. xy
Thomas

@Raphael - L-Sistem gramer dönüşümlerini otomatikleştirmeye çalışıyorum ... bu yüzden normal formda değil. Aslında daha kesin hale getirmek için bu soruyu tekrar düzenleyeceğim.
Thomas

Umarım soruyu çok fazla değiştirmedim - şimdi biraz farklı bir doğaya sahip.
Thomas

Yanıtlar:


6

Çalışan bir algoritma tanımlayacağım. Çalışma süresi çok kötü olmamalı. Bunun bir kısmını önceden hesaplayabilirsiniz.

Bunu varsayıyoruz (muhtemelen kolay bu durumda uyum olsa) nonterminallerin içermez ve bilmediklerini x , y veya türetilmesini bir . Ayrıca dilbilginizin hiçbir türevde hiç kullanılmayan yapımları içermediğini varsayacağım ( örneğin A A ).axyaAA

Ana konu gerçekten ayrıştırmak için sen sona devletlerin tür bilmek istiyorum gibi takip edebilirsiniz biliyorum bu yüzden, bir . Bu x'i bilmediğiniz kadar kolay değil .aax

Earley'in algoritmasının bir uyarlamasını kullanıyoruz . Önce bu algoritmayı anlamak isteyeceksiniz. Başlatma ve tamamlama adımlarımız farklı olmadıkça algoritmamız neredeyse aynı şekilde çalışır.

Başlatma için, her geçtiği için bir Earley öğe ile bizim ilk seti tohum (ilk karakterin bir senin dilbilgisi herhangi üretiminde). Bu öğenin arka işaretçisini geçersiz bir değer olan -1 olarak ayarladık. Değiştirilmiş tamamlamamızda bu önemlidir. Aslında -1 'bu üretimin nereden başladığı hakkında hiçbir fikrim yok' anlamına geliyor.a1a

Şimdi, Earley algoritmasını olası ilk Earley öğeleri için ayrı ayrı gerçekleştiriyoruz. Ayrıştırmaları birbirine müdahale edebileceğinden, hepsini aynı anda yapamayız. Burada geri izlemekten daha hızlı bir yöntem göremiyorum.

Tamamlama adımı için, yalnızca -1 geri işaretçisi işlemek için bir değişiklik yapmamız gerekir. Kökeni bilmediğimiz bir prodüksiyonu tamamladığımız için başımız belada. Bununla birlikte, Pennello ve DeRemer tarafından L A L R ( 1 ) önden okuma kümelerini hesaplamak için kullanılan yöntemLALR(1) bizi kurtarır: burada ihtiyacımız olan tam olarak L A L R ( 1 ) önden okuma setleri. Bu ileri okuma setlerindeki her öğenin dilbilgisinde karşılık gelen bir konumu vardır ve bu da tamamlanmış üretimin olası bir devamına karşılık gelir.LALR(1)

LALR(1)

a

Düzenleme: Ben geri izleme tarafından getirilen havai çoğunu kaldıran yöntemi buldum düşünüyorum. Her Earley öğesiyle, bu tanımlayıcıların öneklerini kullanmamız gerektiğinden, dizeler olan bir dizi tanımlayıcı ile ilişkilendiriyoruz. Başlatma sırasında, tüm başlangıç ​​öğelerini Earley setine ekler ve her setle benzersiz bir tanımlayıcı ilişkilendiririz.

Tarayıcı ve öngörücü adımlar üzerinde tanımlayıcılar yeni öğelere taşınır. Aynı Earley setindeki yalnızca tanımlayıcılarında farklılık gösteren earley öğeleri, tanımlayıcıları birleştirilerek birleştirilir. Bu adımı her bir tanımlayıcı için ayrı ayrı yapmak zorunda kalmadan, bu yeni öğeler üzerinde tanımlayıcılarla tarayıcı ve öngörücü adımlar gerçekleştirebileceğimizi unutmayın.

LALR(1)

Temel olarak, geri tanımlamayı bu tanımlayıcıları kullanarak yapıyoruz, böylece tarayıcı ve öngörücü adımlarda çift çalışma yapmıyoruz.


aa

@Thomas Bu çok zor değil: sadece terminal olmayanı ayrıştırmadaki belirli bir konum için bir terminal olarak görürsünüz: hala normal olarak tahmin edersiniz ve tamamlarsınız, ancak tarama sırasında da düşünürsünüz.
Alex ten Brink

Evet, gerçekten - şimdi çözümünüzü anladığım için, hiçbir fark yaratmamalıdır.
Thomas
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.