The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#!/usr/bin/env perl
#
use strict;
# ------------------------------------------------
my($parser) = Regexp::Parsertron -> new;
my(@test) =
(
{
item => 1,
expected => '', # This is a placeholder since I don't know the answer.
re => qr/(A(*COMMIT)|B)(A|B)D/,
},
{
item => 2,
expected => '', # This is a placeholder since I don't know the answer.
re => qr/(A|B)(A(*COMMIT)|B)D/,
},
{
item => 3,
expected => '', # This is a placeholder since I don't know the answer.
re => qr/(a(*COMMIT)b){0}a(?1)|aac/,
},
{
item => 4,
expected => '', # This is a placeholder since I don't know the answer.
re => qr/(??{""})(a(*COMMIT)b){0}a(?1)|aac/,
},
);
my($expected);
my($got);
my($message);
my($result);
for my $test (@test)
{
$result = $parser -> parse(re => $$test{re}, verbose => 1);
if (! defined $result)
{
print "Parse is ambiguous. \n";
}
elsif ($result == 0) # 0 is success.
{
$got = $parser -> as_string;
$expected = $$test{expected};
$message = "$$test{item}: re: $$test{re}. got: $got";
$message .= ' (After calling append(...) )' if ($$test{item} == 12);
print "got: $got. expected: $expected. message: $message. \n";
}
else
{
print "Case $$test{item} failed to return 0 (== success) from parse(). \n";
}
# Reset for next test.
$parser -> reset;
}