Memadankan Tatabahasa Sensitif Konteks dengan PCRE: {a^n b^n c^n}
Sementara ungkapan biasa secara historis dikaitkan dengan biasa tatabahasa, pelaksanaan moden seperti PCRE mempamerkan keupayaan lanjutan yang melangkaui rangka kerja teori ini. Salah satu kebolehan tersebut ialah ungkapan tatabahasa sensitif konteks.
Dalam hal ini, persoalan timbul: bolehkah PCRE menghuraikan {a^n b^n c^n}, tatabahasa yang tidak dapat dihuraikan dengan ungkapan biasa? Jawapannya, seperti yang ditunjukkan oleh beberapa pengguna, adalah "ya" yang mengagumkan.
Satu penyelesaian yang sangat menarik yang dikemukakan oleh pengguna melibatkan penggunaan pernyataan yang memandang ke hadapan yang positif:
~^ (?=(a(?-1)?b)c) a+(b(?-1)?c) $~x
Penjelasan:
Tanpa penegasan memandang ke hadapan, regex menyemak nombor sewenang-wenangnya sebagai, diikuti dengan bilangan bs dan cs yang sama. Walau bagaimanapun, ini tidak memastikan bahawa bilangan sebagai sama dengan bilangan bs, seperti yang dikehendaki oleh tatabahasa.
Pernyataan pandangan ke hadapan, khususnya (?=(a(?-1)?b)c), menangani masalah ini. Ia sepadan dengan jujukan sebagai, diikuti dengan bs, setiap kali memastikan bilangan sebagai sepadan dengan bilangan bs. Kemasukan c memastikan bahawa padanan menggunakan semua bs.
Kesimpulan:
Contoh ini mempamerkan kuasa luar biasa pelaksanaan regex moden. Keupayaan PCRE untuk menghuraikan tatabahasa bukan konteks bebas menyerlahkan kepelbagaian dan kapasitinya untuk menyatakan corak yang kompleks. Ini mencabar kepercayaan yang telah lama dipegang bahawa regex hanya mampu menangkap bahasa biasa.
Atas ialah kandungan terperinci Bolehkah PCRE Memadankan Tatabahasa Sensitif Konteks seperti {a^n b^n c^n}?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!