Bahasa apa yang dikenali oleh ekspresi reguler yang kompatibel dengan Perl?


23

Seperti judulnya, saya menghabiskan beberapa jam akhir pekan lalu mencoba untuk menyelesaikan pikiran saya tentang kelas bahasa yang cocok dengan ekspresi reguler yang kompatibel dengan Perl, tidak termasuk operator yang cocok yang memungkinkan untuk mengeksekusi kode arbitrer di dalam pola .

Jika Anda tidak tahu apa itu PCRE, baca ini dan ini .

Masalahnya adalah, sumber daya yang tersedia di internet cukup banyak berhenti pada bahasa bebas konteks, dan PCRE dapat mencocokkan lebih dari itu (lihat di bawah); tapi aku benar-benar tidak tahu di mana menemukan teorema atau makalah tentang hal semacam ini.

Khususnya: PCRE jelas merupakan superset dari bahasa reguler (karena sintaks PCRE memiliki semua operator bahasa reguler).

CFG apa pun dapat diletakkan dalam bentuk normal Greibach, yang menghilangkan rekursi kiri. Saya pikir ini dapat digunakan dengan cara (?(DEFINE)...)kelompok untuk "menerjemahkan" tata bahasa ke dalam subrutin yang cocok, menghindari tersedak rekursi kiri, dengan menerjemahkan:

  • non-terminal di kepala setiap produksi menjadi subrutin (?<HEAD>...)
  • tubuh setiap produksi dimasukkan ke dalam subrutin; terminal dibiarkan apa adanya, non-terminal menjadi prosedur doa (yaitu (?&NONTERMINAL));
  • semua produksi dengan nonterminal yang sama dengan head di ORed bersama oleh |operator (ditambah pengelompokan tambahan dengan (?:...), jika perlu)
  • polanya kemudian menjadi (?(DEFINE)...)grup yang berisi semua produksi "yang diterjemahkan", dan doa untuk prosedur simbol awal, untuk mencocokkan seluruh string, yaitu^(?(DEFINE)...)(?&START)$

Ini harus berurusan dengan CFG apa pun. Oleh karena itu, PCRE harus dapat mencocokkan CFL apa pun.

Masih ada lagi: mari kita ambil bahasa yang sederhana yaitu bahasa string diulang dua kali. Bahasa ini bukan CFL - lemma pemompaan untuk CFL gagal. (Berikan perhatian khusus yang harus dipegang | v x w |p , sehingga Anda tidak bisa hanya memompa awal atau akhir dari dua string yang berulang.)

L.={ww|wΛ}
|vxw|hal

Namun, bahasa ini mudah cocok dengan PCRE sebuah: ^(.*)\1$. Karena itu, kami benar-benar di atas CFL.

Berapa banyak di atas? Seperti yang saya katakan, saya tidak tahu. Saya tidak dapat menemukan sumber daya tentang CSL atau semua kelas lain di antaranya untuk mengambil keputusan. Adakah pakar yang bersedia membahas hal ini?

Tambahan: Saya diminta untuk menentukan subset sintaks PCRE mana yang harus diizinkan. Seperti yang saya tulis di awal posting, saya ingin mengecualikan operator yang memungkinkan untuk mengeksekusi kode arbitrer di dalam pola, seperti ??{}.

Demi argumen itu, saya pikir kita bisa tetap dengan sintaks yang ditentukan oleh halaman manual pcresyntax (3) , yang merupakan subset wajar dari apa yang ditawarkan Perl 5.10-5.12, dikurangi info (karena tidak ada di dalam pola). Saya tidak yakin bahwa menambah atau menghapus kata kerja kontrol penelusuran ulang mengubah bahasa yang dapat kita kenali; jika demikian, akan menyenangkan untuk mencari tahu kelas mana yang kita dapatkan dan yang tidak.


2
Harap sertakan definisi PCRE yang Anda pilih dalam pertanyaan Anda, karena telah berubah antar versi. Regex Perl yang sebenarnya dapat berisi kode Perl yang arbitrer, menjadikannya Turing-complete.
Gilles 'SO- berhenti bersikap jahat'

Saya menambahkan catatan di akhir, saya harap ini membuat poin ini lebih jelas.
peppe

Jawaban:


7

Saya juga menemukan posting blog ini sangat menarik http://nikic.github.io/2012/06/15/The-true-power-of- Regular-expressions.html . Ini memberikan bukti yang sama yang saya berikan sebelumnya tentang fakta bahwa regexps mengenali CFL (dengan menulis ulang tata bahasa melalui DEFINEblok), dan bahkan beberapa CSL (seperti bahasa string berulang); itu dibangun di atas itu dan terus berjalan, memberikan bukti bahwa regexps dengan referensi-balik adalah NP-hard (dengan mengurangi 3-SAT ke regexp).


2
Ketika penulis mengatakan "NP-complete" mereka seharusnya mengatakan "NP-hard". Mereka tidak memberikan bukti bahwa kelas bahasa PCRE terkandung dalam NP.
András Salamon

Benar, itu juga dicatat dalam komentar.
peppe

5

Mereka paling banyak memutuskan bahasa konteks-sensitif (yang, seperti yang Anda tunjukkan, adalah superset dari bahasa bebas konteks). Lihat posting biksu perl ini .

Wawasan dasar adalah bahwa "memori" mesin adalah jumlah kelompok tangkap, yang dibatasi secara linear.


5
Argumen yang Anda berikan pada paragraf kedua menjelaskan mengapa PCRE tidak dapat menerima lebih dari CS, tetapi tidak mengapa inklusi ini tepat (yang Anda sarankan dalam paragraf pertama Anda). Tampaknya artikel yang ditautkan juga tidak membuktikan hal itu.
Raphael

Nah, Anda tidak dapat mengelompokkan lebih dari apa yang ada di string input, dan jumlah grup ditetapkan dalam pola tertentu, sehingga Anda memiliki batas atas (linier) untuk memori yang digunakan pola. Namun, saya kehilangan bukti formal PCRE -> transformasi otomat linear terikat ...
peppe

Ya, kalian berdua benar. Saya telah memodifikasi jawabannya.
Xodarap

Lihat juga perlmonks.org/?node_id=406253 untuk diskusi sebelumnya.
András Salamon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.