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:
SUMT→U|M→T|aUbT|aUbc|aMbU→aMbM|c→aT|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, M∗U, 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.