The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use 5.010;
use warnings;
use Test::More 'no_plan';

my $parser = do{
    use Regexp::Grammars;
    qr{
        <num=(\d++)>
      | <_pat='".*"'> <str=(??{ $MATCH{_pat} })>
      | <bool=(?{'true or false'})>
    }xms
};

my $WARNINGS;
my $lookbehind = do {
    use Regexp::Grammars;
    BEGIN {
        close *Regexp::Grammars::LOGFILE;
        open *Regexp::Grammars::LOGFILE, '>', \$WARNINGS;
    }
    qr{
          <foo=( (?<!bar) (?<=ar) foo )>
    }xms;
};

if ($] < 5.018 || $] >= 5.020) {
    ok !defined $WARNINGS => "No warnings found '$WARNINGS'";
}

ok +('"abc"' =~ $parser) => 'Matched <str>';
is $/{str}, '"abc"'      => 'Captured correctly';

ok +(42 =~ $parser) => 'Matched <num>';
is $/{num}, 42      => 'Captured correctly';

ok +('true' =~ $parser)      => 'Matched <bool>';
is $/{bool}, 'true or false' => 'Pseudo-captured correctly';

ok +('barfoo' !~ $lookbehind)      => 'Neg lookbehind worked';
ok +('foo'    !~ $lookbehind)      => 'Pos lookbehind worked';

ok +('carfoo' =~ $lookbehind)     => 'Both lookbehinds worked';
is $/{foo}, 'foo' => 'Pseudo-captured correctly';