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
|
#!/usr/bin/perl
use v5.14;
use warnings;
use Test2::V0;
my %vars = (
ONE => 1,
TWO => 2,
RECUR => '$ONE + $TWO',
HERE => "X",
);
my $where;
package TestParser {
use base qw( Parser::MGC );
sub parse
{
my $self = shift;
my $parts = $self->sequence_of( sub {
$self->any_of(
sub { my ( $varname ) = ( $self->expect( qr/\$(\w+)/ ) )[1];
$self->include_string( $vars{$varname} ) },
sub { my $ret = $self->substring_before( '$' );
$where = [ $self->where ] if $ret eq "X";
return $ret },
)
} );
return join "", @$parts;
}
}
my $parser = TestParser->new;
# basic recursion using ->include_string
{
is( $parser->from_string( q(No vars here) ), "No vars here", 'No vars' );
is( $parser->from_string( q(Simple $ONE var) ), "Simple 1 var", 'A var' );
is( $parser->from_string( q(Recursive $RECUR here) ), "Recursive 1 + 2 here", 'Recursive var' );
}
# ->where position reporting
{
is( $parser->from_string( q(Position $HERE) ), "Position X", 'Result of $HERE test' );
is( $where, [ 1, 1, "X" ], 'Position during $HERE' );
}
done_testing;
|