Parse-Token-Lite

 view release on metacpan or  search on metacpan

lib/Parse/Token/Lite/Builder.pm  view on Meta::CPAN

package Parse::Token::Lite::Builder;

use Parse::Token::Lite;
use Carp;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(ruleset on name with match start end);

our $VERSION = '0.200'; # VERSION
# ABSTRACT: DSL for Parse::Token::Lite

*_on = sub{ croak 'on'; };
*_name = sub{ croak 'name'; };
*_with = sub{ croak 'with'; };
*_match = sub{ croak 'match'; };
*_start = sub{ croak 'start'; };
*_end = sub{ croak 'end'; };

sub on($&){ goto &_on };
sub name($){ goto &_name };
sub with(&){ goto &_with };
sub match($&){ goto &_match };
sub start($){ goto &_start };
sub end($){ goto &_end };

sub ruleset(&){
	my $rules = {};
	my $code = shift;

	local *_match = sub($&){
		my ($pat, $code) = @_;
		my $_rule = {re=>$pat, state=>[] };
		
		local *_name = sub($){ $_rule->{name} = $_[0]; };
		local *_with = sub(&){ $_rule->{func} = $_[0]; };
		local *_start = sub($){ push(@{$_rule->{state}}, '+'.$_[0]); }; 
		local *_end  = sub($){ push(@{$_rule->{state}}, '-'.$_[0]); }; 

		$code->();
		push(@{$rules->{MAIN}},$_rule);
	};

	local *_on = sub($&){
		my ($state, $code) = @_;

		local *_match = sub($&){
			my ($pat, $code) = @_;
			my $_rule = {re=>$pat, state=>[] };
			
			local *_name = sub($){ $_rule->{name} = $_[0]; };
			local *_with = sub(&){ $_rule->{func} = $_[0]; };
			local *_start = sub($){ push(@{$_rule->{state}}, '+'.$_[0]); }; 
			local *_end  = sub($){ push(@{$_rule->{state}}, '-'.$_[0]); }; 

			$code->();
			push(@{$rules->{$state}},$_rule);
		};

		$code->();
	};

	$code->();

	return $rules;
}
1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Parse::Token::Lite::Builder - DSL for Parse::Token::Lite

=head1 VERSION



( run in 2.989 seconds using v1.01-cache-2.11-cpan-364913b4093 )