Jump to content
 







Main menu
   


Navigation  



Main page
Contents
Current events
Random article
About Wikipedia
Contact us
Donate
 




Contribute  



Help
Learn to edit
Community portal
Recent changes
Upload file
 








Search  

































Create account

Log in
 









Create account
 Log in
 




Pages for logged out editors learn more  



Contributions
Talk
 



















Contents

   



(Top)
 


1 History  





2 Changes from Perl 5  



2.1  Implicit changes  







3 Integration with Perl  





4 Implementation  



4.1  Keywords  





4.2  Modifiers  





4.3  Grammars  







5 Examples  





6 References  





7 External links  














Raku rules






Español
 

Edit links
 









Article
Talk
 

















Read
Edit
View history
 








Tools
   


Actions  



Read
Edit
View history
 




General  



What links here
Related changes
Upload file
Special pages
Permanent link
Page information
Cite this page
Get shortened URL
Download QR code
Wikidata item
 




Print/export  



Download as PDF
Printable version
 
















Appearance
   

 






From Wikipedia, the free encyclopedia
 


Raku rules are the regular expression, string matching and general-purpose parsing facility of the Raku programming language, and are a core part of the language. Since Perl's pattern-matching constructs have exceeded the capabilities of formal regular expressions for some time, Raku documentation refers to them exclusively as regexes, distancing the term from the formal definition.

Raku provides a superset of Perl 5 features with respect to regexes, folding them into a larger framework called rules, which provide the capabilities of a parsing expression grammar, as well as acting as a closure with respect to their lexical scope.[1] Rules are introduced with the rule keyword, which has a usage quite similar to subroutine definitions. Anonymous rules can be introduced with the regex (orrx) keyword, or simply be used inline as regexes were in Perl 5 via the m (matching) or s (substitution) operators.

History[edit]

InApocalypse 5, a document outlining the preliminary design decisions for Raku pattern matching, Larry Wall enumerated 20 problems with the "current regex culture". Among these were that Perl's regexes were "too compact and 'cute'", had "too much reliance on too few metacharacters", "little support for named captures", "little support for grammars", and "poor integration with 'real' language".[2]

Between late 2004 and mid-2005, a compiler for Raku style rules was developed for the Parrot virtual machine called Parrot Grammar Engine (PGE), which was later renamed to the more generic Parser Grammar Engine. PGE is a combination of runtime and compiler for Raku style grammars that allows any parrot-based compiler to use these tools for parsing, and also to provide rules to their runtimes.

Among other Raku features, support for named captures was added to Perl 5.10 in 2007.[3]

In May 2012, the reference implementation of Raku, Rakudo, shipped its Rakudo Star monthly snapshot with a working JSON parser built entirely in Raku rules.[4]

Changes from Perl 5[edit]

There are only six unchanged features from Perl 5's regexes:

A few of the most powerful additions include:

The following changes greatly improve the readability of regexes:

Implicit changes[edit]

Some of the features of Perl 5 regular expressions are more powerful in Raku because of their ability to encapsulate the expanded features of Raku rules. For example, in Perl 5, there were positive and negative lookahead operators (?=...) and (?!...). In Raku these same features exist, but are called <before ...> and <!before ...>.

However, because before can encapsulate arbitrary rules, it can be used to express lookahead as a syntactic predicate for a grammar. For example, the following parsing expression grammar describes the classic non-context-free language :

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

In Raku rules that would be:

ruleS { <before <A> <!before b>> a+ <B> }
ruleA { a <A>? b }
ruleB { b <B>? c }

Of course, given the ability to mix rules and regular code, that can be simplified even further:

ruleS { (a+) (b+) (c+) <{$0.elems == $1.elems == $2.elems}> }

However, this makes use of assertions, which is a subtly different concept in Raku rules, but more substantially different in parsing theory, making this a semantic rather than syntactic predicate. The most important difference in practice is performance. There is no way for the rule engine to know what conditions the assertion may match, so no optimization of this process can be made.

Integration with Perl[edit]

In many languages, regular expressions are entered as strings, which are then passed to library routines that parse and compile them into an internal state. In Perl 5, regular expressions shared some of the lexical analysis with Perl's scanner. This simplified many aspects of regular expression usage, though it added a great deal of complexity to the scanner. In Raku, rules are part of the grammar of the language. No separate parser exists for rules, as it did in Perl 5. This means that code, embedded in rules, is parsed at the same time as the rule itself and its surrounding code. For example, it is possible to nest rules and code without re-invoking the parser:

ruleab {
    (a.) # match "a" followed by any character
    # Then check to see if that character was "b"
    # If so, print a message.
    { $0 ~~ /b {say "found the b"}/ }
}

The above is a single block of Raku code that contains an outer rule definition, an inner block of assertion code, and inside of that a regex that contains one more level of assertion.

Implementation[edit]

Keywords[edit]

There are several keywords used in conjunction with Raku rules:

regex
A named or anonymous regex that ignores whitespace within the regex by default.
token
A named or anonymous regex that implies the :ratchet modifier.
rule
A named or anonymous regex that implies the :ratchet and :sigspace modifiers.
rx
An anonymous regex that takes arbitrary delimiters such as // where regex only takes braces.
m
An operator form of anonymous regex that performs matches with arbitrary delimiters.
mm
Shorthand for m with the :sigspace modifier.
s
An operator form of anonymous regex that performs substitution with arbitrary delimiters.
ss
Shorthand for s with the :sigspace modifier.
/.../
Simply placing a regex between slashes is shorthand for rx/.../.

Here is an example of typical use:

token word { \w+ }
rule phrase { <word> [ \, <word> ]* \. }
if $string ~~ / <phrase> \n / {
    ...
}

Modifiers[edit]

Modifiers may be placed after any of the regex keywords, and before the delimiter. If a regex is named, the modifier comes after the name. Modifiers control the way regexes are parsed and how they behave. They are always introduced with a leading : character.

Some of the more important modifiers include:

For example:

 regex addition { :ratchet :sigspace <term> \+ <expr> }

Grammars[edit]

A grammar may be defined using the grammar operator. A grammar is essentially just a namespace for rules:

grammar Str::SprintfFormat {
    regex format_token { \%: <index>? <precision>? <modifier>? <directive> }
    token index { \d+ \$ }
    token precision { <flags>? <vector>? <precision_count> }
    token flags { <[\ +0\#\-]>+ }
    token precision_count { [ <[1-9]>\d* | \* ]? [ \. [ \d* | \* ] ]? }
    token vector { \*? v }
    token modifier { ll | <[lhmVqL]> }
    token directive { <[\%csduoxefgXEGbpniDUOF]> }
}

This is the grammar used to define Perl's sprintf string formatting notation.

Outside of this namespace, you could use these rules like so:

if / <Str::SprintfFormat::format_token> / { ... }

A rule used in this way is actually identical to the invocation of a subroutine with the extra semantics and side-effects of pattern matching (e.g., rule invocations can be backtracked).

Examples[edit]

Here are some example rules in Raku:

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

That last is identical to:

rx { (ab[bb]*) }

References[edit]

  1. ^ Wall, Larry (June 24, 2002). "Synopsis 5: Regexes and Rules".
  • ^ Wall, Larry (June 4, 2002). "Apocalypse 5: Pattern Matching".
  • ^ Perl 5.10 now available - Perl Buzz Archived 2008-01-09 at the Wayback Machine
  • ^ moritz (May 5, 2012). "Rakudo Star 2012.05 released".
  • External links[edit]


    Retrieved from "https://en.wikipedia.org/w/index.php?title=Raku_rules&oldid=996007735"

    Categories: 
    Raku (programming language)
    Regular expressions
    Hidden category: 
    Webarchive template wayback links
     



    This page was last edited on 24 December 2020, at 01:11 (UTC).

    Text is available under the Creative Commons Attribution-ShareAlike License 4.0; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.



    Privacy policy

    About Wikipedia

    Disclaimers

    Contact Wikipedia

    Code of Conduct

    Developers

    Statistics

    Cookie statement

    Mobile view



    Wikimedia Foundation
    Powered by MediaWiki