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
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.