Apakah ada algoritma parsing CFG nongeneral yang mengenali EPAL?

23

EPAL, bahasa bahkan palindrom, didefinisikan sebagai bahasa yang dihasilkan oleh tata bahasa bebas konteks berikut:

Saa

Sbb

SaSa

SbSb

EPAL adalah 'kutukan' dari banyak algoritma penguraian: Saya belum menemukan algoritma penguraian untuk CFG yang pasti yang dapat menguraikan tata bahasa apa pun yang menjelaskan bahasa. Ini sering digunakan untuk menunjukkan bahwa ada CFG yang tidak ambigu yang tidak dapat diurai oleh parser tertentu. Ini menginspirasi pertanyaan saya:

Apakah ada beberapa algoritma penguraian yang hanya menerima CFG yang jelas yang bekerja pada EPAL?

Tentu saja, seseorang dapat merancang pengurai dua-jalur ad-hoc untuk tata bahasa yang mem-parsing bahasa dalam waktu linier. Saya tertarik dengan metode parsing yang belum dirancang khusus dengan EPAL dalam pikiran.

Alex ten Brink
sumber
1
Saya hampir takut untuk bertanya: apa yang salah dengan LL (1) oleh keturunan rekursif?
Raphael
3
Turunan rekursif non-mundur tidak dapat menangani EPAL karena bahasanya bukan LL (k) untuk k. Keturunan rekursif dengan backtracking dapat menangani tata bahasa dalam waktu , tetapi itu adalah algoritma umum dengan perilaku terburuk kasus eksponensial, yang bukan yang saya cari. O(n2)
Alex ten Brink
O ( 2 N )O(N2) bukan eksponensial, tetapi kuadratik. adalah eksponensial. O(2N)
Victor Stafusa
1
@ Viktor: mundur memiliki perilaku eksponensial pada beberapa tata bahasa, hanya saja tidak pada tata bahasa tertentu ini. Namun, itu menjadi sebuah algoritma yang bekerja pada tata bahasa yang mendua mendiskonnya sebagai jawaban atas pertanyaan saya.
Alex ten Brink
1
@jmad: maksud saya bukan untuk menguraikan bahasa (Anda dapat melakukannya secara sepele dalam waktu linier), tetapi untuk memuaskan keingintahuan saya: Saya telah melihatnya digunakan sebagai contoh bahasa yang tidak dapat diuraikan dengan metode penguraian berkali-kali aku penasaran apakah ada beberapa metode parsing yang mengenalinya.
Alex ten Brink

Jawaban:

14

Pertimbangkan sketsa strategi parsing berikut dengan risiko Anda sendiri.

Alih-alih membaca input hanya dari satu ujung, kami membaca dari kedua sisi dan mencari aturan yang cocok. Kita bisa melakukan ini dalam gaya keturunan rekursif; dalam panggilan ke , cari awalan dan suffix ke input sedemikian rupa sehingga ada aturan , turun ke pada kata yang tersisa. Jika tidak ada aturan yang cocok, tolak kata tersebut.w v A w B v B ( )A()wvAwBvB()

Algoritma ini mem-parsing semua tata bahasa linier, tidak ambigu. Dibutuhkan waktu linier jika semua pasangan aturan dan memiliki atau ¹. Ini termasuk EPAL. Kalau tidak, kita perlu melihat ke depan sehingga kita mungkin mengambil waktu.AwBvAwBvwpwvsvΘ(n2)

Idenya tidak bekerja untuk tata bahasa non-linear sama sekali. Tata bahasa linier tapi ambigu pada umumnya tidak dapat diuraikan tanpa mundur (setidaknya untuk input negatif).


  1. wpv berarti di sini bahwa dan , yaitu kata tidak merupakan awalan dari yang lain. mirip dengan sufiks.wvvws
Raphael
sumber
1
Luar biasa! Persis apa yang saya cari. Sangat bagus bahwa bahasa yang bukan untuk apa pun dapat diuraikan dengan algoritma sederhana. NLR(k)k
Alex ten Brink
1
Setelah memikirkan hal ini lagi, saya menemukan kesalahan kecil dalam deskripsi Anda: tata bahasa linier tidak ambigu, tetapi tidak ada awalan unik seperti yang Anda gambarkan. Masih ada awalan yang unik, tetapi Anda mungkin harus melihat ke dalam nonterminal untuk mendapatkannya, dan waktu berlari Anda menjadi . Algoritme Anda bekerja pada . SaAb|aBb,Aa,BbO(n2)EPAL
Alex ten Brink
@AlextenBrink Tangkapan yang bagus. Saya mengedit akun ini.
Raphael