Perl6-Pugs
view release on metacpan or search on metacpan
perl5/Pugs-Compiler-Rule/RuleInline-more.pl view on Meta::CPAN
package Pugs::Runtime::RuleInline;
# - fglock
#
use strict;
use warnings;
use Data::Dumper;
use PadWalker qw( peek_my ); # peek_our ); ???
sub alternation {
return '( ' . join( ' || ', @_ ) . ' )';
}
sub concat {
return '( ' . join( ' && ', @_ ) . ' )';
}
# 2 versions - match anywhere; match at $pos
sub constant_at_pos {
my $const = shift;
my $len = length( $const );
'( ( substr( $s, $pos, '.$len.' ) eq \''.$const.'\' )
? do { $pos += '.$len.'; push @match, \''.$const.'\' }
: 0
)'
}
sub constant_anywhere {
my $const = shift;
"( ( \$s =~ m/\Q$const\E/s )
? do { \$pos = pos \$s; push \@match, $const }
: 0
)"
}
# implements <after>
# $pos must be saved
sub constant_reversed {
my $const = shift;
my $len = length( $const );
'( ( substr( $s, $pos - '.$len.', '.$len.' ) eq \''.$const.'\' )
? do { $pos -= '.$len.' }
: 0
)'
sub greedy_star {
"do { while @_ {} }"
}
sub null {
"1";
};
sub wrap {
return "sub {
my \@match; my \$pos = 0; my \$s = shift;
$_[0];
return \\\@match; \n}\n";
}
my $r =
concat(
alternation( constant_at_pos('a'), constant_at_pos('b') ),
constant_at_pos('b'),
greedy_star( constant_at_pos('x') ),
);
print wrap( $r );
my $x = eval wrap( $r );
print Dumper( $x->("abxxxd") );
( run in 1.999 second using v1.01-cache-2.11-cpan-56fb94df46f )