Raku kuralları - Raku rules

Raku kuralları bunlar Düzenli ifade, dize eşleme ve genel amaçlı ayrıştırma tesisi Raku programlama dili ve dilin temel bir parçasıdır. Dan beri Perl desen eşleştirme yapıları, resmi bir süredir düzenli ifadeler kullanıyorsa, Raku belgeleri bunlardan yalnızca şu şekilde bahsediyor: normal ifadeler, terimi biçimsel tanımdan uzaklaştırmak.

Raku, normal ifadelere göre Perl 5 özelliklerinin bir üst kümesini sağlar ve bunları daha geniş bir çerçeveye katlar: kurallar, bir ifade dilbilgisini ayrıştırma yanı sıra bir kapatma sözcük kapsamlarına göre.[1] Kurallar, kural alt rutin tanımlarına oldukça benzer bir kullanıma sahip olan anahtar kelime. Anonim kurallar, normal ifade (veya rx) anahtar sözcüğü veya normal ifadeler Perl 5'te olduğu için satır içi olarak kullanılabilir. m (eşleşen) veya s (ikame) operatörleri.

Tarih

İçinde Kıyamet 5Raku örüntü eşleştirmesinin ön tasarım kararlarını özetleyen bir belge olan Larry Wall, "mevcut normal ifade kültürü" ile ilgili 20 sorunu numaralandırdı. Bunlar arasında Perl'in normal ifadelerinin "çok derli toplu ve" sevimli "olması," çok az meta karaktere çok fazla güvenmesi "," adlandırılmış yakalamalar için çok az destek "," gramerler için çok az destek "ve" gerçek "ile zayıf entegrasyon vardı. dil".[2]

2004 sonu ile 2005 ortası arasında, Raku stil kuralları için bir derleyici geliştirildi. Parrot sanal makine Parrot Dilbilgisi Motoru (PGE) olarak adlandırıldı ve daha sonra daha genel olarak yeniden adlandırıldı Ayrıştırıcı Dilbilgisi Motoru. PGE, herhangi bir papağan tabanlı derleyicinin bu araçları ayrıştırma için kullanmasına ve ayrıca çalışma zamanlarına kurallar sağlamasına olanak tanıyan Raku stili gramerler için çalışma zamanı ve derleyicinin bir kombinasyonudur.

Diğer Raku özelliklerinin yanı sıra, 2007'de Perl 5.10'a adlandırılmış yakalamalar için destek eklendi.[3]

Mayıs 2012'de Raku'nun referans uygulaması, Rakudo, Rakudo Star aylık anlık görüntüsünü çalışan bir JSON ayrıştırıcı tamamen Raku kurallarında oluşturulmuştur.[4]

Perl 5'ten Değişiklikler

Perl 5'in normal ifadelerinden yalnızca altı değişmemiş özellik vardır:

  • Değişmezler: kelime karakterleri (harfler, sayılar ve vurgulamak ) tam anlamıyla eşleşti
  • Yakalama: (...)
  • Alternatifler: |
  • Ters eğik çizgi kaçış:
  • Tekrarlama niceleyicileri: *, +, ve ?, Ama değil {m, n}
  • Minimum eşleşen son ek: *?, +?, ??

En güçlü eklemelerden bazıları şunları içerir:

  • Kullanarak kurallara başvurma yeteneği <rulename> tüm gramerleri oluşturmak için.
  • Programcının kontrol etmesine izin veren bir avuç commit operatörü geri izleme eşleştirme sırasında.

Aşağıdaki değişiklikler, normal ifadelerin okunabilirliğini büyük ölçüde iyileştirir:

  • Yakalamayan basitleştirilmiş gruplar: [...]Perl 5'ler ile aynıdır: (?:...)
  • Basitleştirilmiş kod iddiaları: <?{...}>
  • Beyaz boşlukların eşleştirilmeden dahil edilmesine izin vererek çok satırlı normal ifadelere izin verir. Kullanım veya ' ' boşluk ifade etmek için.
  • Genişletilmiş normal ifade biçimlendirme (Perl 5'ler / x) artık varsayılandır.

Örtük değişiklikler

Perl 5 normal ifadelerinin bazı özellikleri, Raku kurallarının genişletilmiş özelliklerini kapsama yeteneklerinden dolayı Raku'da daha güçlüdür. Örneğin, Perl 5'te pozitif ve negatif önden okuma operatörleri vardı (?=...) ve (?!...). Raku'da bu aynı özellikler vardır, ancak <before ...> ve <!before ...>.

Ancak, çünkü önce gelişigüzel kuralları kapsayabilir, ileri görüşlü olarak ifade etmek için kullanılabilir. sözdizimsel yüklem bir gramer için. Örneğin, aşağıdaki ifade dilbilgisini ayrıştırma klasiği tanımlar bağlamdan bağımsız dil :

S ← & (A! B) a + BA ← a A? bB ← b B? c

Raku kurallarında şunlar olabilir:

kural S { <before <A> <!before b>> a+ <B> }kural Bir { bir ? b }kural B { b ? c }

Tabii ki, kuralları ve normal kodu karıştırma yeteneği göz önüne alındığında, bu daha da basitleştirilebilir:

Ancak bu, iddialar, Raku kurallarında oldukça farklı bir kavram olan, ancak ayrıştırma teorisinde büyük ölçüde farklı olan bu, bunu sözdizimsel değil anlamsal bir yüklem haline getirir. Uygulamadaki en önemli fark performanstır. Kural motorunun, iddianın hangi koşullarla eşleşebileceğini bilmesinin bir yolu yoktur, bu nedenle bu sürecin optimizasyonu yapılamaz.

Perl ile entegrasyon

Pek çok dilde, düzenli ifadeler dizeler olarak girilir ve daha sonra bunları ayrıştıran ve bir iç duruma derleyen kitaplık yordamlarına aktarılır. Perl 5'te, normal ifadeler bazılarını paylaştı sözcük analizi Perl'in tarayıcısı ile. Bu, tarayıcıya büyük bir karmaşıklık katsa da, normal ifade kullanımının birçok yönünü basitleştirdi. Raku'da kurallar dilin gramerinin bir parçasıdır. Perl 5'te olduğu gibi, kurallar için ayrı bir ayrıştırıcı yoktur. Bu, kurallara gömülü olan kodun, kuralın kendisi ve çevreleyen kodla aynı zamanda çözümlendiği anlamına gelir. Örneğin, ayrıştırıcıyı yeniden çağırmadan kuralları ve kodu iç içe yerleştirmek mümkündür:

kural ab {    (a.) # "a" ile ardından herhangi bir karakterle eşleşir# Sonra bu karakterin "b" olup olmadığını kontrol edin# Öyleyse, bir mesaj yazdırın.{ $0 ~~ / b {"b'yi bul" deyin} / }}

Yukarıdakiler, bir dış kural tanımını, bir iç onaylama kodu bloğunu ve bunun içinde bir daha fazla iddia düzeyi içeren bir normal ifadeyi içeren tek bir Raku kodu bloğudur.

Uygulama

Anahtar kelimeler

Raku kurallarıyla bağlantılı olarak kullanılan birkaç anahtar kelime vardır:

normal ifade
Varsayılan olarak normal ifade içindeki beyaz boşlukları yok sayan adlandırılmış veya anonim bir normal ifade.
jeton
Belirtilen veya anonim bir normal ifade : mandal değiştirici.
kural
Belirtilen veya anonim bir normal ifade : mandal ve : sigspace değiştiriciler.
rx
Şunlar gibi rastgele sınırlayıcılar alan anonim bir normal ifade // burada regex yalnızca kaşlı ayraç alır.
m
Rasgele sınırlayıcılarla eşleşmeler gerçekleştiren anonim normal ifadenin operatör biçimi.
mm
İle m için kestirme : sigspace değiştirici.
s
Keyfi sınırlayıcılarla değiştirme gerçekleştiren anonim normal ifadenin operatör biçimi.
ss
İle s kısaltması : sigspace değiştirici.
/.../
Eğik çizgilerin arasına bir normal ifade yerleştirmek, rx /.../.

İşte tipik bir kullanım örneği:

jeton kelime { w + }kural ifade {  [, ] *. }Eğer $ string ~~ /  / {    ...}

Değiştiriciler

Değiştiriciler, normal ifade anahtar kelimelerinden herhangi birinin sonrasına ve sınırlayıcının önüne yerleştirilebilir. Bir normal ifade adlandırılırsa, değiştirici addan sonra gelir. Değiştiriciler, normal ifadelerin ayrıştırılma şeklini ve nasıl davrandıklarını kontrol eder. Her zaman bir lider ile tanıştırılırlar : karakter.

Daha önemli değiştiricilerden bazıları şunları içerir:

  • :ben veya : ignorecase - Büyük / küçük harfe bakmaksızın eşleştirme yapın.
  • : m veya : göz ardı işareti - Karakterleri birleştirmeye saygı duymadan eşleştirme yapın.
  • : g veya : global - Belirli bir hedef dizede eşleştirmeyi birden çok kez gerçekleştirin.
  • : s veya : sigspace - Normal ifadedeki beyaz boşlukları, sadece yok saymak yerine boşluk eşleştirme kuralıyla değiştirin.
  • : Perl5 - Normal ifadeyi Perl 5 normal ifadesi olarak ele alın.
  • : cırcır - Kuralda asla geri izleme yapmayın.

Örneğin:

 normal ifade ilave { : ratchet: sigspace  + }

Gramerler

Dilbilgisi kullanılarak tanımlanabilir. dilbilgisi Şebeke. Dilbilgisi aslında sadece bir ad alanı kurallar için:

dilbilgisi Str :: SprintfFormat {    normal ifade format_token { \%: ? ? ? }    jeton indeks { d + $ }    jeton hassas { <flags>? <vector>? <precision_count> }    jeton bayraklar { <[ +0#-]>+ }    jeton Precision_count { [<[1-9]> d * | *]? [. [d * | *]]? }    jeton vektör { *? v }    jeton değiştirici { ll | <[lhmVqL]>}    jeton direktif { <[\%csduoxefgXEGbpniDUOF]> }}

Bu, Perl'i tanımlamak için kullanılan gramerdir. sprintf dize biçimlendirme gösterimi.

Bu ad alanının dışında şu kuralları kullanabilirsiniz:

Eğer / <Str::SprintfFormat::format_token> / { ... }

Bu şekilde kullanılan bir kural, desen eşleştirmesinin fazladan anlamsal ve yan etkileri olan bir alt yordamın çağrılmasıyla aslında aynıdır (örneğin, kural çağrıları geriye doğru izlenebilir).

Örnekler

İşte Raku'daki bazı örnek kurallar:

rx { a [ b | c ] (d | e) f : g }rx { (ab*) <{ $1.boyut % 2 == 0 }> }

Sonuncusu şununla aynıdır:

rx { (ab[bb]*) }

Referanslar

  1. ^ Wall, Larry (24 Haziran 2002). "Özet 5: Normal ifadeler ve Kurallar".
  2. ^ Wall, Larry (4 Haziran 2002). "Apocalypse 5: Kalıp Eşleştirme".
  3. ^ Perl 5.10 artık mevcut - Perl Buzz Arşivlendi 2008-01-09'da Wayback Makinesi
  4. ^ moritz (5 Mayıs 2012). "Rakudo Star 2012.05 yayınlandı".

Dış bağlantılar