“En yakın eşleşme” dışında “sarkan başka” sorunun farklı bir çözümü var mı?


9

Aşağıdaki bağlamdan bağımsız dilbilgisi "başka bir sarkan" tür belirsizliği sunar ( aanlamına gelir if expr thenvebanlamına gelir elsevec başka bir tür talimat veya blok anlamına gelir):

SaSbS|aS|c
Örneğin, aacbc olarak ayrıştırılabilir (a(acbc)) veya gibi (a(ac)bc) (bu dilbilgisi için en basit / en kısa belirsiz kelime).

Bu "sarkan başka" belirsizliği çözmenin "standart" yolu "başka" yı zorlar (b) en yakın / en içteki "if-then" ile eşleştirmek için ifade (a). Bu, aşağıdaki gibi gerçekleştirilebilir:

SaTbS|aS|cTaTbT|c
Bu dilbilgisi kesin değil. Yukarıdaki örnekte,(a(acbc)) ayrıştırma.

Soru: Belirsizliği çözmek için başka bir doğal yol var mı?(a(ac)bc) ayrıştırma aacbc? Başka bir deyişle, yukarıdaki iki dil ile aynı dili üreten, açık olan ve bu ayrışan bir dilbilgisi arıyorumaacbc gibi (a(ac)bc).

Açıklama: İlk denemem şöyleydi:

SaSbS|aU|cUaU|c
belirsizliğini gideren aacbc gerektiği gibi - ancak bu dilbilgisi hala belirsiz: aacbacbc olarak ayrıştırılabilir (a(ac)b(acbc)) veya gibi (a(acb(ac))bc).

1
Ve son örneğinizde, olası iki ayrıştırmadan hangisini "doğal" veya doğru olarak görüyorsunuz ve neden?
rici

@rici Evet, bu zor bir soru! ve bilmiyorum. Her ikisinin de ayrıştırılmasını sağlayan açık bir dilbilgisi ile mutlu olacağımaacbacbc. En çok önemsediğim şeyaaaaaacbcbcbc (devamı adaha b's) k-sonuncu b ile koyunu bırakanların a (ve en içten ayrılır aeşleşmez).
Gro-Tsen

Yanıtlar:


7

Bu sorun, bazı yakın parantezlerin atlandığı bir ifadedeki parantezleri eşleştirme sorununun tam bir analogudur. Burada bir "if" (veyaa temsili dilbilgisinde) açık bir parantez ve bir "başka" dır (b) yakın bir parantezdir. (Dizisindenas ve bs mekanik olarak ekleyebilirsiniz cs her birine bir tane yerleştirerek b ve en sonunda bir tane var.) Parantez içindeki beynime daha iyi uyduğu için eldeki sorun sanki yazıyorum.

Geleneksel "en yakın maç" sarkan-başka çözünürlük her bir kapanışı en yeni henüz eşleşmemiş açık ile eşleştirir. Bu, eşleşen bir açık ile eşleşen kapanışı arasında hiçbir zaman eşsiz bir açık (veya bu konuda yakın) olmadığı anlamına gelir.

Olası bir alternatif, her kapanışı mümkün olan en erken eşsiz açık ile eşleştirmek olacaktır. Burada "Mümkün" ifadesi, açıklığın parantez yuvalamasını ihlal etmeden eşleştirilebileceği anlamına gelir (örn.( içinde ()() sonuncusu ile eşleşemez )).

Bu eşleme dışarıdan yapılmalıdır, böylece tüm kapalı çiftler eşleştirilene kadar bir kapanış için eşleşme denenmez. Bu gerçek, sınırlı bir ileri okuma algoritması ile bir ayrıştırma üretmeyi imkansız hale getirir, çünkü ayrıştırma, dizeyi tamamen eşleşen segmentlere böldükten sonra her iki uçtan içe doğru çalışmak zorundadır (çünkü bunlar potansiyel eşleşme aralığını etkili bir şekilde sınırlar).

Ancak, çevrimiçi bir soldan sağa ayrıştırıcının bulunmaması, açık bir CFG'nin olmadığı anlamına gelmez. (Açıkçası: palindromik bir dil her iki uçtan ortaya doğru ayrıştırılmalıdır, ancak açık bir dilbilgisi yazmak kolaydır).

"En uzaktaki eşleşme" parantez sorunu için bir dilbilgisi üretmek için, eşleşmeyen bir açıklamanın ardından eşleşen bir açıklamanın izlenemeyeceğine güvenmiştim. Öyle olsaydı, en uzak eşleşme özelliği geçerli olmazdı çünkü eşleşmeyen açık, eşleşen açıkın kapanışıyla eşleşebilirdi, bu nedenle eşleşmemiş olması en uzak eşleşme özelliğini ihlal ediyordu.

İşte biraz karmaşık dilbilgisi:

SU|MUT|aUbT|aUbc|aMbUMaMbM|cTaT|ac

S başlangıç ​​sembolüdür; M tam eşlemeli ifadelerdir; U kesinlikle eşleşmeyen ifadelerdir (yani en az bir eşleşmeyen içerirler) a, bu yüzden boş olamazlar) ve T sadece eşsiz olan "kuyruk "tur as. Eşsiz açıklar hakkındaki yukarıdaki gerçek doğrudan dilbilgisinden okunabilir: eşleşmeyen tüm açıklıklarT, bir T yalnızca bir Uve bir U sadece bir T.

Bu beceriksizlik, Uboş dizeyle eşleşmesini önler. Bu, sahte belirsizlikleri düşündüğüm bir sürü şeyi önler: Açılış ve kapanışların eşleşmesinin tüm alternatif çözümlerde aynı olması anlamında sahte. EğerUboş bırakılabilir, aynı zamanda tamamen dengeli bir dize elde edilir. Dan beriS aslında, MU, bu tamamen dengeli olarak değerlendirebileceğiniz bir belirsizliğe yol açar S bir dizi olmak M ardından boş Uveya bir veya daha az M ardından tamamen dengeli U.

Muhtemelen seçtiğimden daha iyi bir geçici çözüm var. Ama bu işe yarıyor gibi görünüyor ve bunu test etmek için kullandığım Bison'un GLR ayrıştırıcısı ile iyi oynuyor; Bu ayrıştırıcı, belirsizliği işlemek için ekstra kod yazmadığınız sürece belirsiz ayrıştırmalardan şikayet eder ve bunu yapmak için çok tembeltim. 20'ye kadar açık + kapanışa kadar dizelerle test ettim ve yanlış yerleştirilmiş diziler için ayrıştırma üretmeden, doğru şekilde iç içe diziler için kesin bir ayrıştırma üretmiş gibi görünüyor.


Sonuçlandırdığım şeyi gerçekleştirdiğim için tebrikler muhtemelen imkansızdı! Deneysel olarak ≤16 uzunluktaki kelimeler için bu dilbilgisinin gerçekten açık olduğunu ve sorumdaki kelimelerle aynı kelimeleri ürettiğini kontrol ettim. Şimdi nasıl çalıştığını ayrıntılı olarak anlamalıyım!
Gro-Tsen

@ Gro-Tsen: Umarım ikinci paragraf açıklamaya yardımcı olur. Dilbilgisi, içinde kalan sahte belirsizlikler ile çok daha basittir:SaSbT|aMbS (M benim çözümümde olduğu gibi, TaT|c) ve bu sorunu düşünürken ortaya çıkan şey buydu. Yapmam gerektiğine kendimi ikna etmek biraz zaman aldıUbelirsiz ayrıştırmalardan kaçınmak için hükümsüz olmalıyım (dediğim gibi, belirsizlik göreli olsa da) ve bunu zorlamayı seçtiğim yoldan hoşnutsuzluğumun etrafında çalışmak için bir süre daha. Bahse girerim daha zarif bir sunum var.
rici

0

+ B + c + d + e ve abcde alın. Bir dilbilgisinin bunları nasıl ayrıştırabileceğinin iki belirgin yolu vardır, ancak kullanmamızın bir yolu vardır.

"Başka sarkan" durumunda, insanlar buna böyle bakmazlar. Bunun yerine sözdizimi "if", ardından sıfır, bir veya daha fazla "else if" ve ardından isteğe bağlı "else" olarak yorumlanır.


Unutmayın "eğer… o zaman ... başka ise ... o zaman ... başka ise ... o zaman ... başka ..." acbacbacbcbenim gösterimde: bu ilk dilbilgim (ve verdiğim değişkenler) tarafından açıkça ayrıştırılıyor, bu yüzden bunun alternatif bir ayrıştırmasını istemiyorum.
Gro-Tsen
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.