The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Do not edit this file - Generated by Perlito 7.0
use v5;
use utf8;
use strict;
use warnings;
no warnings ('redefine', 'once', 'void', 'uninitialized', 'misc', 'recursion');
use Perlito::Perl5::Runtime;
use Perlito::Perl5::Prelude;
our $MATCH = Perlito::Match->new();
{
package GLOBAL;
    sub new { shift; bless { @_ }, "GLOBAL" }

    # use v6 
;
    {
    package Perlito::Grammar;
        sub new { shift; bless { @_ }, "Perlito::Grammar" }
        sub unless {
            my $grammar = $_[0];
            my $str = $_[1];
            my $pos = $_[2];
            (my  $MATCH);
            ($MATCH = Perlito::Match->new(('str' => $str), ('from' => $pos), ('to' => $pos), ('bool' => 1)));
            (($MATCH)->{bool} = ((do {
    ((my  $pos1) = $MATCH->to());
    (do {
    ((((((((((('u' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to()))))) && ((('n' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('l' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('e' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('s' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('s' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && (do {
    ((my  $m2) = $grammar->ws($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        1
    }
    else {
        0
    }
})) && (do {
    ((my  $m2) = $grammar->exp($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        ($MATCH->{'exp'} = $m2);
        1
    }
    else {
        0
    }
})) && (((do {
    ((my  $body) = (${$MATCH->{'exp'}})->{'end_block'});
    if (!((defined($body)))) {
        die(('Missing code block in ' . chr(39) . 'unless' . chr(39)))
    };
    ($MATCH->{capture} = (If->new(('cond' => (${$MATCH->{'exp'}})->{'exp'}), ('body' => Lit::Block->new(('stmts' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    $List_a
}))), ('otherwise' => $body))))
}) || 1)))
})
})));
            $MATCH
        };
        sub if {
            my $grammar = $_[0];
            my $str = $_[1];
            my $pos = $_[2];
            (my  $MATCH);
            ($MATCH = Perlito::Match->new(('str' => $str), ('from' => $pos), ('to' => $pos), ('bool' => 1)));
            (($MATCH)->{bool} = ((do {
    ((my  $pos1) = $MATCH->to());
    (do {
    ((((((('i' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to()))))) && ((('f' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && (do {
    ((my  $m2) = $grammar->ws($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        1
    }
    else {
        0
    }
})) && (do {
    ((my  $m2) = $grammar->exp($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        ($MATCH->{'exp'} = $m2);
        1
    }
    else {
        0
    }
})) && (do {
    ((my  $pos1) = $MATCH->to());
    (((do {
    (((((((do {
    ((my  $m2) = $grammar->opt_ws($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        1
    }
    else {
        0
    }
}) && ((('e' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('l' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('s' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('e' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && (do {
    ((my  $m2) = $grammar->exp2($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        ($MATCH->{'exp2'} = $m2);
        1
    }
    else {
        0
    }
})) && (((do {
    ((my  $body) = (${$MATCH->{'exp'}})->{'end_block'});
    ((my  $otherwise) = (${$MATCH->{'exp2'}})->{'exp'});
    if (!((defined($body)))) {
        die(('Missing code block in ' . chr(39) . 'if' . chr(39)))
    };
    if (!((defined($otherwise)))) {
        die(('Missing code block in ' . chr(39) . 'else' . chr(39)))
    };
    if (Main::isa($otherwise, 'Lit::Hash')) {
        ($otherwise = Lit::Block->new(('stmts' => $otherwise->hash1())))
    };
    ($MATCH->{capture} = (If->new(('cond' => (${$MATCH->{'exp'}})->{'exp'}), ('body' => $body), ('otherwise' => $otherwise))))
}) || 1)))
}) || (do {
    (($MATCH)->{to} = $pos1);
    (((((((do {
    ((my  $m2) = $grammar->opt_ws($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        1
    }
    else {
        0
    }
}) && ((('e' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('l' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('s' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && (do {
    ((my  $m2) = $grammar->if($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        ($MATCH->{'if'} = $m2);
        1
    }
    else {
        0
    }
})) && (((do {
    ((my  $body) = (${$MATCH->{'exp'}})->{'end_block'});
    if (!((defined($body)))) {
        die(('Missing code block in ' . chr(39) . 'if' . chr(39)))
    };
    ($MATCH->{capture} = (If->new(('cond' => (${$MATCH->{'exp'}})->{'exp'}), ('body' => $body), ('otherwise' => Lit::Block->new(('stmts' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, ${$MATCH->{'if'}} );
    $List_a
}))))))
}) || 1))))
})) || (do {
    (($MATCH)->{to} = $pos1);
    ((((do {
    ((my  $body) = (${$MATCH->{'exp'}})->{'end_block'});
    if (!((defined($body)))) {
        die(('Missing code block in ' . chr(39) . 'if' . chr(39)))
    };
    ($MATCH->{capture} = (If->new(('cond' => (${$MATCH->{'exp'}})->{'exp'}), ('body' => $body), ('otherwise' => Lit::Block->new(('stmts' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    $List_a
}))))))
}) || 1)))
}))
}))
})
})));
            $MATCH
        };
        sub when {
            my $grammar = $_[0];
            my $str = $_[1];
            my $pos = $_[2];
            (my  $MATCH);
            ($MATCH = Perlito::Match->new(('str' => $str), ('from' => $pos), ('to' => $pos), ('bool' => 1)));
            (($MATCH)->{bool} = ((do {
    ((my  $pos1) = $MATCH->to());
    (do {
    ((((((((('w' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to()))))) && ((('h' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('e' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('n' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && (do {
    ((my  $m2) = $grammar->ws($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        1
    }
    else {
        0
    }
})) && (do {
    ((my  $m2) = $grammar->exp($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        ($MATCH->{'exp'} = $m2);
        1
    }
    else {
        0
    }
})) && (((do {
    ((my  $body) = (${$MATCH->{'exp'}})->{'end_block'});
    if (!((defined($body)))) {
        die(('Missing code block in ' . chr(39) . 'when' . chr(39)))
    };
    ($MATCH->{capture} = (When->new(('parameters' => (${$MATCH->{'exp'}})->{'exp'}), ('body' => $body))))
}) || 1)))
})
})));
            $MATCH
        };
        sub for {
            my $grammar = $_[0];
            my $str = $_[1];
            my $pos = $_[2];
            (my  $MATCH);
            ($MATCH = Perlito::Match->new(('str' => $str), ('from' => $pos), ('to' => $pos), ('bool' => 1)));
            (($MATCH)->{bool} = ((do {
    ((my  $pos1) = $MATCH->to());
    (do {
    (((((((('f' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to()))))) && ((('o' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('r' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && (do {
    ((my  $m2) = $grammar->ws($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        1
    }
    else {
        0
    }
})) && (do {
    ((my  $m2) = $grammar->exp($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        ($MATCH->{'exp'} = $m2);
        1
    }
    else {
        0
    }
})) && (((do {
    ((my  $body) = (${$MATCH->{'exp'}})->{'end_block'});
    if (!((defined($body)))) {
        die(('Missing code block in ' . chr(39) . 'when' . chr(39)))
    };
    ($MATCH->{capture} = (For->new(('cond' => (${$MATCH->{'exp'}})->{'exp'}), ('topic' => undef()), ('body' => $body))))
}) || 1)))
})
})));
            $MATCH
        };
        sub while {
            my $grammar = $_[0];
            my $str = $_[1];
            my $pos = $_[2];
            (my  $MATCH);
            ($MATCH = Perlito::Match->new(('str' => $str), ('from' => $pos), ('to' => $pos), ('bool' => 1)));
            (($MATCH)->{bool} = ((do {
    ((my  $pos1) = $MATCH->to());
    (do {
    (((((((((('w' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to()))))) && ((('h' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('i' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('l' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('e' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && (do {
    ((my  $m2) = $grammar->ws($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        1
    }
    else {
        0
    }
})) && (do {
    ((my  $m2) = $grammar->exp($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        ($MATCH->{'exp'} = $m2);
        1
    }
    else {
        0
    }
})) && (((do {
    ((my  $body) = (${$MATCH->{'exp'}})->{'end_block'});
    if (!((defined($body)))) {
        die(('Missing code block in ' . chr(39) . 'while' . chr(39)))
    };
    ($MATCH->{capture} = (While->new(('cond' => (${$MATCH->{'exp'}})->{'exp'}), ('body' => $body))))
}) || 1)))
})
})));
            $MATCH
        };
        sub loop {
            my $grammar = $_[0];
            my $str = $_[1];
            my $pos = $_[2];
            (my  $MATCH);
            ($MATCH = Perlito::Match->new(('str' => $str), ('from' => $pos), ('to' => $pos), ('bool' => 1)));
            (($MATCH)->{bool} = ((do {
    ((my  $pos1) = $MATCH->to());
    (do {
    ((((((((('l' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to()))))) && ((('o' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('o' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && ((('p' eq substr($str, $MATCH->to(), 1)) && ((($MATCH)->{to} = (1 + $MATCH->to())))))) && (do {
    ((my  $m2) = $grammar->ws($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        1
    }
    else {
        0
    }
})) && (do {
    ((my  $m2) = $grammar->exp($str, $MATCH->to()));
    if ($m2) {
        (($MATCH)->{to} = $m2->to());
        ($MATCH->{'exp'} = $m2);
        1
    }
    else {
        0
    }
})) && (((do {
    ((my  $body) = (${$MATCH->{'exp'}})->{'end_block'});
    if (!((defined($body)))) {
        ($body = (${$MATCH->{'exp'}})->{'exp'});
        if (Main::isa($body, 'Lit::Block')) {
            ($MATCH->{capture} = (While->new(('cond' => Val::Bit->new(('bit' => 1))), ('body' => $body))))
        }
        else {
            die(('Missing code block in ' . chr(39) . 'loop' . chr(39)))
        }
    }
    else {
        die((chr(39) . 'loop' . chr(39) . ' with parameters is not implemented'))
    }
}) || 1)))
})
})));
            $MATCH
        }
    }


}

1;