1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
#! /usr/bin/env perl
use strict;
use warnings;
use Test::More;
BEGIN{
BAIL_OUT "A bug in Perl 5.20 regex compilation prevents the use of PPR under that release"
if $] > 5.020 && $] < 5.022;
}
use PPR::X;
use re 'eval';
my $METAREGEX = qr{
\A \s* (?&PerlQuotelike) \s* \Z
(?(DEFINE)
(?<PerlInfixBinaryOperator>
((?&PerlStdInfixBinaryOperator))
(?{
if ($^N eq '//' || $^N eq '||') {
pass "Found infix: $^N";
}
else {
pass "Interim-matched extra infix: $^N";
}
})
)
(?<PerlBinaryExpression>
((?&PerlStdBinaryExpression))
(?{
if ( $^N eq q{$var{x} // croak()}
|| $^N eq q{$var{x} || croak()} )
{
pass "Found correct binary expression: $^N";
}
else {
pass "Interim-matched extra binary expression: $^N";
}
})
)
)
$PPR::X::GRAMMAR
}xms;
for my $src_code (<DATA>) {
subtest $src_code => sub {
ok $src_code =~ $METAREGEX => 'Matched METAREGEX';
}
}
done_testing();
__DATA__
s<(RE)>< $var{x} // croak() >ge
s[(RE)][ $var{x} // croak() ]ge
s{(RE)}{ $var{x} // croak() }ge
s((RE))( $var{x} // croak() )ge
s"(RE)" $var{x} // croak() "ge
s%(RE)% $var{x} // croak() %ge
s'(RE)' $var{x} // croak() 'ge
s+(RE)+ $var{x} // croak() +ge
s,(RE), $var{x} // croak() ,ge
s/(RE)/ $var{x} || croak() /ge
s@(RE)@ $var{x} // croak() @ge
s|(RE)| $var{x} // croak() |ge
|