Saya ingin mengurai bahasa khusus domain yang ditentukan pengguna. Bahasa-bahasa ini biasanya dekat dengan notasi matematika (saya tidak menguraikan bahasa alami). Pengguna menentukan DSL mereka dalam notasi BNF, seperti ini:
expr ::= LiteralInteger
| ( expr )
| expr + expr
| expr * expr
Input suka 1 + ( 2 * 3 )
harus diterima, sedangkan input suka 1 +
harus ditolak sebagai salah, dan input suka 1 + 2 * 3
harus ditolak sebagai ambigu.
Kesulitan utama di sini adalah mengatasi tata bahasa yang ambigu dengan cara yang ramah pengguna. Membatasi tata bahasa agar tidak ambigu bukanlah pilihan: begitulah bahasa - idenya adalah bahwa penulis lebih suka menghilangkan tanda kurung ketika mereka tidak perlu untuk menghindari ambiguitas. Selama sebuah ekspresi tidak ambigu, saya perlu menguraikannya, dan jika tidak, saya perlu menolaknya.
Pengurai saya harus bekerja pada tata bahasa bebas konteks apa pun, bahkan yang ambigu, dan harus menerima semua input yang tidak ambigu. Saya membutuhkan pohon parse untuk semua input yang diterima. Untuk input yang tidak valid atau ambigu, saya idealnya menginginkan pesan kesalahan yang bagus, tetapi untuk memulainya saya akan mengambil apa yang bisa saya dapatkan.
Saya biasanya akan meminta parser pada input yang relatif pendek, dengan input yang lebih lama sesekali. Jadi algoritma asimptotically lebih cepat mungkin bukan pilihan terbaik. Saya ingin mengoptimalkan distribusi sekitar 80% input kurang dari 20 simbol, 19% antara 20 dan 50 simbol, dan 1% input lebih jarang. Kecepatan untuk input yang tidak valid bukan masalah utama. Selanjutnya, saya mengharapkan modifikasi DSL sekitar setiap 1000 hingga 100000 input; Saya dapat menghabiskan beberapa detik untuk memproses kembali tata bahasa saya, bukan beberapa menit.
Algoritma penguraian apa yang harus saya selidiki, mengingat ukuran input tipikal saya? Haruskah pelaporan kesalahan menjadi faktor dalam pilihan saya, atau haruskah saya berkonsentrasi pada penguraian input yang tidak ambigu dan mungkin menjalankan pengurai yang benar-benar terpisah dan lebih lambat untuk memberikan umpan balik kesalahan?
(Dalam proyek di mana saya membutuhkannya (beberapa waktu lalu), saya menggunakan CYK , yang tidak terlalu sulit untuk diterapkan dan bekerja secara memadai untuk ukuran input saya tetapi tidak menghasilkan kesalahan yang sangat bagus.)
x+y+z
.
+
, jadi x+y+z
memang ambigu karenanya salah.