use Test::More tests => 8;
use Data::Dumper;
$Data::Dumper::Indent = 1;
use_ok( 'Pugs::Compiler::Rule' );
use base 'Pugs::Grammar::Base';
{
=for docs - see S05
* An interpolated hash matches the longest possible key of the hash as
a literal, or fails if no key matches. (A "" key will match
anywhere, provided no longer key matches.)
* If the corresponding value of the hash element is a closure, it is executed.
* If it is a string or rule object, it is executed as a subrule.
* If it has the value 1, nothing special happens beyond the match.
* Any other value causes the match to fail.
=cut
my $match;
my $v = 0;
my %test = (
if => 2, # fail (number, not '1')
iff => 1, # match (longer than 'if')
until => Pugs::Compiler::Regex->compile('(a.a)'),
# subrule - match "until(aa)"
use => sub { $v = 1 },
# closure - print "use()"
);
$rule1 = Pugs::Compiler::Regex->compile('%test 123');
$match = $rule1->match("iff123");
is($match,'iff123',"Matched hash{iff}");
$match = $rule1->match("if123");
is($match,'',"fail hash{if} - value != 1");
is($v,0,"closure not called yet");
$match = $rule1->match("use");
is($v,1,"closure was called hash{use}");
$match = $rule1->match("untilaba123");
#print Dumper($match);
is($match,'untilaba123',"subrule hash{until}");
is($match->(),'untilaba123',"subrule hash{until} - 2");
}
{
my $match;
my %test = (
rule1 => Pugs::Compiler::Regex->compile('xx %test yy'),
rule2 => Pugs::Compiler::Regex->compile('abc'),
);
$rule1 = Pugs::Compiler::Regex->compile('%test 123');
#print $rule1->perl5;
$match = $rule1->match("rule1xxrule2abcyy123");
is($match,'rule1xxrule2abcyy123',"Matched hash inside hash");
}