Perl uyumlu normal ifadeler hangi dilleri tanıyor?


23

Başlığın dediği gibi, geçen hafta sonu birkaç saatimi , kalıp içinde rasgele kod yürütmeye izin veren eşleşen bir operatör hariç olmak üzere Perl uyumlu normal ifadelerle eşleşen dillerin sınıfı hakkında düşünmeye çalışarak geçirdim .

PCRE'lerin ne olduğunu bilmiyorsanız, lütfen bunu ve bunu okuyun .

Sorun şu ki, internette mevcut olan kaynaklar bağlamsız dillerde oldukça durmaktadır ve PCRE'ler bunlardan daha fazlasını karşılayabilir (aşağıya bakınız); ama bu tür şeyler hakkında daha fazla teorem veya makalenin nerede bulunacağını bilmiyorum.

Özellikle: PCRE'ler belli ki normal dillerin bir süpersetidir (PCRE sözdiziminin tüm düzenli dil operatörlerine sahip olması nedeniyle).

Herhangi bir CFG, sol özyinelemeyi gideren normal biçimde Greibach'a konabilir. Bunun (?(DEFINE)...), dilbilgisini "eş anlamlı alt yordamlara" çevirmek ", sol yinelemede boğulmaktan kaçınarak, çevirerek kullanabileceğini düşünüyorum:

  • Her bir üretimin başındaki terminal olmayan bir alt yordam olur (?<HEAD>...)
  • her bir üretimin gövdesi alt rutinde yer alır; terminaller olduğu gibi bırakılır, terminal olmayanlar prosedür başlatmalarına dönüşür (yani (?&NONTERMINAL));
  • Kafa ile aynı nonterminal olan tüm ürünler, |operatör aracılığıyla birlikte ORE edilir (ayrıca (?:...)gerekirse ilave gruplama )
  • kalıp daha sonra (?(DEFINE)...)tüm "çevrilmiş" yapımları içeren bir grup haline gelir ve tüm sembolün eşleşmesi için başlangıç ​​sembolünün prosedürü için bir çağrı yapar;^(?(DEFINE)...)(?&START)$

Bu herhangi bir CFG ile başa çıkmak gerekir. Bu nedenle PCRE'ler herhangi bir CFL ile eşleşebilmelidir.

Dahası: basit dili alalım yani dizelerin dili iki kez tekrarlandı. Bu dil bir CFL değil - CFL'lerin pompalama leması başarısız oluyor. ( | V x w |p

L={ww|wΛ*}
|vxw|p
tutması gerektiğine , böylece sadece iki tekrarlanan dizenin başlangıçlarını veya sonlarını pompalayamazsınız.)

Bununla birlikte, bu dil PCRE ile kolayca eşleştirilebilir: ^(.*)\1$ . Bu nedenle, kesinlikle CFL'lerin üstünde olduk.

Ne kadar yukarıda? Dediğim gibi, hiçbir fikrim yok. Kararımı vermek için CSL'ler veya diğer tüm sınıflar hakkında herhangi bir kaynak bulamadım. Bunu tartışmak isteyen herhangi bir uzman var mı?

Ek: Bana tam olarak hangi PCRE sözdiziminin alt kümesine izin verilmesi gerektiğini belirtmem istendi. Yazının başlangıcında yazdığım gibi, kalıbın içinde rasgele kod yürütülmesine izin veren herhangi bir operatörü, örneğin ??{}.

Argüman uğruna, Perres 5.10-5.12'nin sunduğu şeyin makul bir altkümesi olan pcresyntax (3) man sayfasının tanımladığı sözdizimine bağlı kalacağımızı düşünüyorum . Geri izleme kontrol fiillerini eklemenin veya kaldırmanın tanıyacağımız dili değiştirdiğinden emin değilim; eğer öyleyse, hangi sınıflarda onlarla birlikte olduğumuzu bulmak güzel olurdu.


2
Lütfen seçtiğiniz PCRE tanımını, sürümler arasında değiştiği için sorunuza ekleyin. Gerçek Perl regexes Turing-tamamlandı yapma keyfi Perl kodu içerebilir.
Gilles 'SO- kötü olmak'

Sonunda bir not ekledim, umarım bu noktayı daha açık hale getirir.
peppe

Yanıtlar:


7

Bu blog gönderisini ayrıca çok ilginç buldum http://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.html . Regexps'in CFL'leri (dilbilgisini DEFINEbloklar aracılığıyla yeniden yazarak ) ve hatta bazı CSL'leri (tekrarlanan dizelerin dili gibi) tanıdığı gerçeği hakkında daha önce verdiğim kanıtları sunar ; üzerine inşa eder ve devam eder, backreferensli regexps'in NP-hard olduğunu kanıtlar (3-SAT'i regexp'e düşürerek).


2
Yazar “NP-tamam” dediğinde “NP-zor” demeliler. PCRE dilleri sınıfının NP içerisinde bulunduğuna dair bir kanıt sunmazlar.
András Salamon

Doğru, yorumlarda da belirtildi.
peppe

5

Bağlam duyarlı dillerin çoğuna karar veriyorlar (sizin belirttiğiniz gibi, bağlamsız dillerin üstünlüğüdür). Bu perl keşişlerinin gönderisine bakın .

Temel içgörü, makinenin "hafızasının" doğrusal olarak sınırlanan yakalama gruplarının sayısı olduğudur.


5
İkinci paragrafta verdiğiniz argüman, PCRE’nin neden CS’den daha fazla kabul edemediğini , ancak bu eklemenin neden kesin olmadığını (ilk paragrafınızda önerdiğiniz) açıklamıyor . Bağlantılı makale de bunun bir kanıtını vermiş gibi görünmüyor.
Raphael

Eh, giriş dizgisinde olandan daha fazlasını gruplandıramazsınız ve grupların sayısı belirli bir düzende sabittir, bu nedenle bir modelin kullandığı belleğe bir üst (doğrusal) sınırlamanız gerekir. Yine de, PCRE -> lineer sınırlı otomat dönüşümünün resmi bir kanıtını özlüyorum ...
peppe

Evet, siz ikiniz haklısınız. Cevabı değiştirdim.
Xodarap

Daha önceki bir tartışma için perlmonks.org/?node_id=406253 adresine de bakın .
András Salamon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.