class Grammar

Formal grammar made up of named regexes
class Grammar is Match {}

Every type declared with grammar, and not explicitly stating its superclass, becomes a subclass of Grammar.

grammar Identifier {
        token TOP       { <initial> <rest>* }
        token initial   { <+myletter +[_]> }
        token rest      { <+myletter +mynumber +[_]> }
        token myletter  { <[A..Za..z]> }
        token mynumber  { <[0..9]> }
    }
say Identifier.isa(Grammar);                # OUTPUT: «True␤»
    my $match = Identifier.parse('W4anD0eR96');
    say ~$match;                                # OUTPUT: «W4anD0eR96␤»

More documentation on grammars is available.

Methods

method parse

method parse($target, :$rule = 'TOP',  Capture() :$args = \(), Mu :$actions = Mu, *%opt)

Parses the $target, which will be coerced to Str if it isn't one, using $rule as the starting rule. Additional $args will be passed to the starting rule if provided.

grammar RepeatChar {
        token start($character) { $character+ }
    }
say RepeatChar.parse('aaaaaa', :rule('start'), :args(\('a')));
    say RepeatChar.parse('bbbbbb', :rule('start'), :args(\('b')));
# OUTPUT:
    # 「aaaaaa」
    # 「bbbbbb」

If the actions named argument is provided, it will be used as an actions object, that is, for each successful regex match, a method of the same name, if it exists, is called on the actions object, passing the match object as the sole positional argument.

my $actions = class { method TOP($/) { say "7" } };
    grammar { token TOP { a { say "42" } b } }.parse('ab', :$actions);
    # OUTPUT: «42␤7␤»

Additional named arguments are used as options for matching, so you can for example specify things like :pos(4) to start parsing from the fifth (:pos is zero-based) character. All matching adverbs are allowed, but not all of them take effect. There are several types of adverbs that a regex can have, some of which apply at compile time, like :s and :i. You cannot pass those to .parse, because the regexes have already been compiled. But, you can pass those adverbs that affect the runtime behavior, such as :pos and :continue.

say RepeatChar.parse('bbbbbb', :rule('start'), :args(\('b')), :pos(4)).Str;
# OUTPUT: «bb␤»

Method parse only succeeds if the cursor has arrived at the end of the target string when the match is over. Use method subparse if you want to be able to stop in the middle.

The top regex in the grammar will be allowed to backtrack.

Returns a Match on success, and Nil on failure.

method subparse

method subparse($target, :$rule = 'TOP', Capture() :$args = \(),  Mu :$actions = Mu, *%opt)

Does exactly the same as method parse, except that cursor doesn't have to reach the end of the string to succeed. That is, it doesn't have to match the whole string.

Note that unlike method parse, subparse always returns a Match, which will be a failed match (and thus falsy), if the grammar failed to match.

grammar RepeatChar {
        token start($character) { $character+ }
    }
say RepeatChar.subparse('bbbabb', :rule('start'), :args(\('b')));
    say RepeatChar.parse(   'bbbabb', :rule('start'), :args(\('b')));
    say RepeatChar.subparse('bbbabb', :rule('start'), :args(\('a')));
    say RepeatChar.subparse('bbbabb', :rule('start'), :args(\('a')), :pos(3));
# OUTPUT:
    # 「bbb」
    # Nil
    # #<failed match>
    # 「a」

method parsefile

method parsefile(Str(Cool) $filename, :$enc, *%opts)

Reads file $filename encoding by $enc, and parses it. All named arguments are passed on to method parse.

grammar Identifiers {
        token TOP        { [<identifier><.ws>]+ }
        token identifier { <initial> <rest>* }
        token initial    { <+myletter +[_]> }
        token rest       { <+myletter +mynumber +[_]> }
        token myletter   { <[A..Za..z]> }
        token mynumber   { <[0..9]> }
    }
say Identifiers.parsefile('users.txt', :enc('UTF-8'))
        .Str.trim.subst(/\n/, ',', :g);
# users.txt :
    # TimToady
    # lizmat
    # jnthn
    # moritz
    # zoffixznet
    # MasterDuke17
# OUTPUT: «TimToady,lizmat,jnthn,moritz,zoffixznet,MasterDuke17␤»

See Also

class Attribute

Member variable

class Cancellation

Removal of a task from a Scheduler before normal completion

class Channel

Thread-safe queue for sending values from producers to consumers

class CompUnit

CompUnit

class CompUnit::Repository::FileSystem

CompUnit::Repository::FileSystem

class CompUnit::Repository::Installation

CompUnit::Repository::Installation

class Distro

Distribution related information

class IO::ArgFiles

Iterate over contents of files specified on command line

class IO::CatHandle

Use multiple IO handles as if they were one

class IO::Handle

Opened file or stream

class IO::Notification

Asynchronous notification for file and directory changes

class IO::Notification::Change

Changes in a file, produced by watch-file

class IO::Path

File or directory path

class IO::Path::Cygwin

IO::Path pre-loaded with IO::Spec::Cygwin

class IO::Path::Parts

IO::Path parts encapsulation

class IO::Path::QNX

IO::Path pre-loaded with IO::Spec::QNX

class IO::Path::Unix

IO::Path pre-loaded with IO::Spec::Unix

class IO::Path::Win32

IO::Path pre-loaded with IO::Spec::Win32

class IO::Pipe

Buffered inter-process string or binary stream

class IO::Socket::Async

Asynchronous socket in TCP or UDP

class IO::Socket::Async::ListenSocket

A tap for listening TCP sockets

class IO::Socket::INET

TCP Socket

class IO::Spec

Platform specific operations on file and directory paths

class IO::Spec::Cygwin

Platform specific operations on file and directory paths for Cygwin

class IO::Spec::QNX

Platform specific operations on file and directory paths QNX

class IO::Spec::Unix

Platform specific operations on file and directory paths for POSIX

class IO::Spec::Win32

Platform specific operations on file and directory paths for Windows

class IO::Special

Path to special I/O device

class Kernel

Kernel related information

class Lock

A low-level, re-entrant, mutual exclusion lock

class Lock::ConditionVariable

Condition variables used in locks

class Match

Result of a successful regex match

class Pod::Block

Block in a Pod document

class Pod::Block::Code

Verbatim code block in a Pod document

class Pod::Block::Comment

Comment in a Pod document

class Pod::Block::Declarator

Declarator block in a Pod document

class Pod::Block::Named

Named block in a Pod document

class Pod::Block::Para

Paragraph in a Pod document

class Pod::Block::Table

Table in a Pod document

class Pod::Defn

Pod definition list

class Pod::FormattingCode

Pod formatting code

class Pod::Heading

Heading in a Pod document

class Pod::Item

Item in a Pod enumeration list

class Proc

Running process (filehandle-based interface)

class Proc::Async

Running process (asynchronous interface)

class Promise

Status/result of an asynchronous computation

class Regex

String pattern

class Semaphore

Control access to shared resources by multiple threads

class Supplier

Live Supply factory

class Supplier::Preserving

Cached live Supply factory

class Supply

Asynchronous data stream with multiple subscribers

class Tap

Subscription to a Supply

class Thread

Concurrent execution of code (low-level)

class ThreadPoolScheduler

Scheduler that distributes work among a pool of threads

class Unicode

Unicode related information

class VM

Raku Virtual Machine related information

The Camelia image is copyright 2009 by Larry Wall. "Raku" is trademark of the Yet Another Society. All rights reserved.