#!/usr/bin/env perl

use strict;
use warnings;

use Regexp::Parsertron;

use Try::Tiny;

# -----------

my($parser)	= Regexp::Parsertron -> new(verbose => 2);
my(%stats)	= (success => 0, total => 0);
my(%input)	=
(
	1 => q!(?|(.{2,4}))!,
	2 => q!Perl|JavaScript|(?:Flub|BCPL)!,
	3 => q!(?^i:Perl|JavaScript|(?:Flub|BCPL))!,
	4 => q!(?a:b)!,
	5 => q!(?:(?<n>foo)|(?<n>bar))!,
	6 => q!(?:(?<n2>foo)|(?<n2>bar))\k<n2>!,
	7 => q#(?(?!a)a|b)#,
);

my($as_string);
my($error_str);
my($found);
my($re, $result, %re);
my($s);

for my $key (sort keys %input)
{
	$stats{total}++;

	print "Case $key: ";

	$error_str	= '';
	$s			= $input{$key};

	try
	{
		$re	= qr/$s/;
	}
	catch
	{
		$error_str = "Perl error for $s: $_"; # Do it this way because continue and next don't work inside try.

		print $error_str;
	};

	next if ($error_str);

	try
	{
		$result		= $parser -> parse(re => $s);
		$as_string	= $parser -> as_string;
		$re{$key}	= $as_string;

		$stats{success}++ if ($result == 0);

		for my $target ('?')
		{
			$found = $parser -> find($target);

			print "uids of nodes whose text matches =>$target<=: ", join(', ', @$found), "\n";
		}

		$result = $parser -> validate;

		print "Calling validate() on $s: $result (0 is success) \n";
		print "Case: $key. as_string: $as_string. result: $result (0 is success) \n";
	}
	catch
	{
		print $_, "\n";
	};

	print '-' x 100, "\n";

	$parser -> reset;
}

print "Statistics: \n";
print "$_: $stats{$_}. \n" for (sort keys %stats);