Alt-IO-All-new
view release on metacpan or search on metacpan
inc/Pegex/Compiler.pm view on Meta::CPAN
}
}
sub combinate_re {
my ($self, $regexp) = @_;
my $atoms = Pegex::Grammar::Atoms->atoms;
my $re = $regexp->{'.rgx'};
while (1) {
$re =~ s[(?<!\\)(~+)]['<ws' . length($1) . '>']ge;
$re =~ s[<([\w\-]+)>][
(my $key = $1) =~ s/-/_/g;
$self->{tree}->{$key} and (
$self->{tree}->{$key}{'.rgx'} or
die "'$key' not defined as a single RE"
)
or $atoms->{$key}
or die "'$key' not defined in the grammar"
]e;
last if $re eq $regexp->{'.rgx'};
$regexp->{'.rgx'} = $re;
}
}
#-----------------------------------------------------------------------------#
# Compile to native Perl regexes
#-----------------------------------------------------------------------------#
sub native {
my ($self) = @_;
$self->perl_regexes($self->{tree});
return $self;
}
sub perl_regexes {
my ($self, $node) = @_;
if (ref($node) eq 'HASH') {
if (exists $node->{'.rgx'}) {
my $re = $node->{'.rgx'};
$node->{'.rgx'} = qr/\G$re/;
}
else {
for (keys %$node) {
$self->perl_regexes($node->{$_});
}
}
}
elsif (ref($node) eq 'ARRAY') {
$self->perl_regexes($_) for @$node;
}
}
#-----------------------------------------------------------------------------#
# Serialization formatter methods
#-----------------------------------------------------------------------------#
sub to_yaml {
require YAML::XS;
my $self = shift;
return YAML::XS::Dump($self->tree);
}
sub to_json {
require JSON::XS;
my $self = shift;
return JSON::XS->new->utf8->canonical->pretty->encode($self->tree);
}
sub to_perl {
my $self = shift;
require Data::Dumper;
no warnings 'once';
$Data::Dumper::Terse = 1;
$Data::Dumper::Indent = 1;
$Data::Dumper::Sortkeys = 1;
my $perl = Data::Dumper::Dumper($self->tree);
$perl =~ s/\?\^:/?-xism:/g;
$perl =~ s!(\.rgx.*?qr/)\(\?-xism:(.*)\)(?=/)!$1$2!g;
die "to_perl failed with non compatible regex in:\n$perl"
if $perl =~ /\?\^/;
return $perl;
}
1;
( run in 1.367 second using v1.01-cache-2.11-cpan-39bf76dae61 )