package Parse::FieldPath::Parser;
{
$Parse::FieldPath::Parser::VERSION = '0.005';
}
use Parse::RecDescent;
{ my $ERRORS;
package Parse::RecDescent::Parse::FieldPath::Parser;
{
$Parse::RecDescent::Parse::FieldPath::Parser::VERSION = '0.005';
}
use strict;
use vars qw($skip $AUTOLOAD );
@Parse::RecDescent::Parse::FieldPath::Parser::ISA = ();
$skip = '\s*';
{
local $SIG{__WARN__} = sub {0};
# PRETEND TO BE IN Parse::RecDescent NAMESPACE
*Parse::RecDescent::Parse::FieldPath::Parser::AUTOLOAD = sub
{
no strict 'refs';
$AUTOLOAD =~ s/^Parse::RecDescent::Parse::FieldPath::Parser/Parse::RecDescent/;
goto &{$AUTOLOAD};
}
}
push @Parse::RecDescent::Parse::FieldPath::Parser::ISA, 'Parse::RecDescent';
# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
sub Parse::RecDescent::Parse::FieldPath::Parser::field_path
{
my $thisparser = $_[0];
use vars q{$tracelevel};
local $tracelevel = ($tracelevel||0)+1;
$ERRORS = 0;
my $thisrule = $thisparser->{"rules"}{"field_path"};
Parse::RecDescent::_trace(q{Trying rule: [field_path]},
Parse::RecDescent::_tracefirst($_[1]),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
my $err_at = @{$thisparser->{errors}};
my $score;
my $score_return;
my $_tok;
my $return = undef;
my $_matched=0;
my $commit=0;
my @item = ();
my %item = ();
my $repeating = defined($_[2]) && $_[2];
my $_noactions = defined($_[3]) && $_[3];
my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
my %arg = ($#arg & 01) ? @arg : (@arg, undef);
my $text;
my $lastsep="";
my $current_match;
my $expectation = new Parse::RecDescent::Expectation(q{<leftop: field_name /\\// field_name>});
$expectation->at($_[1]);
my $thisline;
tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
while (!$_matched && !$commit)
{
Parse::RecDescent::_trace(q{Trying production: [<leftop: field_name /\\// field_name>]},
Parse::RecDescent::_tracefirst($_[1]),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[0];
$text = $_[1];
my $_savetext;
@item = (q{field_path});
%item = (__RULE__ => q{field_path});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying operator: [<leftop: field_name /\\// field_name>]},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$expectation->is(q{})->at($text);
$_tok = undef;
OPLOOP: while (1)
{
$repcount = 0;
my @item;
# MATCH LEFTARG
Parse::RecDescent::_trace(q{Trying subrule: [field_name]},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
if (1) { no strict qw{refs};
$expectation->is(q{field_name})->at($text);
unless (defined ($_tok = Parse::RecDescent::Parse::FieldPath::Parser::field_name($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
{
Parse::RecDescent::_trace(q{<<Didn't match subrule: [field_name]>>},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched subrule: [field_name]<< (return value: [}
. $_tok . q{]},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$item{q{field_name}} = $_tok;
push @item, $_tok;
}
$repcount++;
my $savetext = $text;
my $backtrack;
# MATCH (OP RIGHTARG)(s)
while ($repcount < 100000000)
{
$backtrack = 0;
Parse::RecDescent::_trace(q{Trying terminal: [/\\//]}, Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$lastsep = "";
$expectation->is(q{/\\//})->at($text);
unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:\/)/)
{
$expectation->failed();
Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
last;
}
$current_match = substr($text, $-[0], $+[0] - $-[0]);
substr($text,0,length($current_match),q{});
Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
. $current_match . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $item{__PATTERN1__}=$current_match;
pop @item;
if (defined $1) {push @item, $item{'field_name(s)'}=$1; $backtrack=1;}
Parse::RecDescent::_trace(q{Trying subrule: [field_name]},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
if (1) { no strict qw{refs};
$expectation->is(q{field_name})->at($text);
unless (defined ($_tok = Parse::RecDescent::Parse::FieldPath::Parser::field_name($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
{
Parse::RecDescent::_trace(q{<<Didn't match subrule: [field_name]>>},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched subrule: [field_name]<< (return value: [}
. $_tok . q{]},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$item{q{field_name}} = $_tok;
push @item, $_tok;
}
$savetext = $text;
$repcount++;
}
$text = $savetext;
pop @item if $backtrack;
unless (@item) { undef $_tok; last }
$_tok = [ @item ];
last;
}
unless ($repcount>=1)
{
Parse::RecDescent::_trace(q{<<Didn't match operator: [<leftop: field_name /\\// field_name>]>>},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched operator: [<leftop: field_name /\\// field_name>]<< (return value: [}
. qq{@{$_tok||[]}} . q{]},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
push @item, $item{'field_name(s)'}=$_tok||[];
Parse::RecDescent::_trace(q{Trying action},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$_tok = ($_noactions) ? 0 : do {
use List::Util qw//;
# Turn qw/a b c/ into { a => { b => { c => {} } } }
my $fields = {};
List::Util::reduce { $a->{$b} = {} if $b } $fields, @{$item{'field_name(s)'}};
$return = $fields;
};
unless (defined $_tok)
{
Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
if defined $::RD_TRACE;
last;
}
Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
. $_tok . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $_tok;
$item{__ACTION1__}=$_tok;
Parse::RecDescent::_trace(q{>>Matched production: [<leftop: field_name /\\// field_name>]<<},
Parse::RecDescent::_tracefirst($text),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
unless ( $_matched || defined($score) )
{
$_[1] = $text; # NOT SURE THIS IS NEEDED
Parse::RecDescent::_trace(q{<<Didn't match rule>>},
Parse::RecDescent::_tracefirst($_[1]),
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
return undef;
}
if (!defined($return) && defined($score))
{
Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
q{field_path},
$tracelevel)
if defined $::RD_TRACE;
$return = $score_return;
}
splice @{$thisparser->{errors}}, $err_at;
$return = $item[$#item] unless defined $return;
if (defined $::RD_TRACE)
{
Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
$return . q{])}, "",
q{field_path},
$tracelevel);
Parse::RecDescent::_trace(q{(consumed: [} .
Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
Parse::RecDescent::_tracefirst($text),
, q{field_path},
$tracelevel)
}
$_[1] = $text;
return $return;
}
# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
sub Parse::RecDescent::Parse::FieldPath::Parser::field_list
{
my $thisparser = $_[0];
use vars q{$tracelevel};
local $tracelevel = ($tracelevel||0)+1;
$ERRORS = 0;
my $thisrule = $thisparser->{"rules"}{"field_list"};
Parse::RecDescent::_trace(q{Trying rule: [field_list]},
Parse::RecDescent::_tracefirst($_[1]),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
my $err_at = @{$thisparser->{errors}};
my $score;
my $score_return;
my $_tok;
my $return = undef;
my $_matched=0;
my $commit=0;
my @item = ();
my %item = ();
my $repeating = defined($_[2]) && $_[2];
my $_noactions = defined($_[3]) && $_[3];
my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
my %arg = ($#arg & 01) ? @arg : (@arg, undef);
my $text;
my $lastsep="";
my $current_match;
my $expectation = new Parse::RecDescent::Expectation(q{field_path});
$expectation->at($_[1]);
my $thisline;
tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
while (!$_matched && !$commit)
{
Parse::RecDescent::_trace(q{Trying production: [field_path '(' fields ')']},
Parse::RecDescent::_tracefirst($_[1]),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[0];
$text = $_[1];
my $_savetext;
@item = (q{field_list});
%item = (__RULE__ => q{field_list});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying subrule: [field_path]},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
if (1) { no strict qw{refs};
$expectation->is(q{})->at($text);
unless (defined ($_tok = Parse::RecDescent::Parse::FieldPath::Parser::field_path($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
{
Parse::RecDescent::_trace(q{<<Didn't match subrule: [field_path]>>},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched subrule: [field_path]<< (return value: [}
. $_tok . q{]},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
$item{q{field_path}} = $_tok;
push @item, $_tok;
}
Parse::RecDescent::_trace(q{Trying terminal: ['(']},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
$lastsep = "";
$expectation->is(q{'('})->at($text);
unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A\(/)
{
$expectation->failed();
Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
last;
}
$current_match = substr($text, $-[0], $+[0] - $-[0]);
substr($text,0,length($current_match),q{});
Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
. $current_match . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $item{__STRING1__}=$current_match;
Parse::RecDescent::_trace(q{Trying subrule: [fields]},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
if (1) { no strict qw{refs};
$expectation->is(q{fields})->at($text);
unless (defined ($_tok = Parse::RecDescent::Parse::FieldPath::Parser::fields($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
{
Parse::RecDescent::_trace(q{<<Didn't match subrule: [fields]>>},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched subrule: [fields]<< (return value: [}
. $_tok . q{]},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
$item{q{fields}} = $_tok;
push @item, $_tok;
}
Parse::RecDescent::_trace(q{Trying terminal: [')']},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
$lastsep = "";
$expectation->is(q{')'})->at($text);
unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A\)/)
{
$expectation->failed();
Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
last;
}
$current_match = substr($text, $-[0], $+[0] - $-[0]);
substr($text,0,length($current_match),q{});
Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
. $current_match . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $item{__STRING2__}=$current_match;
Parse::RecDescent::_trace(q{Trying action},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
$_tok = ($_noactions) ? 0 : do {
sub deepest {
my $hashref = shift;
return $hashref if scalar(keys %$hashref) == 0;
my $key = (keys %$hashref)[0];
return deepest($hashref->{$key});
}
my $deepest = deepest($item{field_path});
$deepest->{$_} = $item{fields}->{$_} for keys %{$item{fields}};
$return = $item{field_path};
};
unless (defined $_tok)
{
Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
if defined $::RD_TRACE;
last;
}
Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
. $_tok . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $_tok;
$item{__ACTION1__}=$_tok;
Parse::RecDescent::_trace(q{>>Matched production: [field_path '(' fields ')']<<},
Parse::RecDescent::_tracefirst($text),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
unless ( $_matched || defined($score) )
{
$_[1] = $text; # NOT SURE THIS IS NEEDED
Parse::RecDescent::_trace(q{<<Didn't match rule>>},
Parse::RecDescent::_tracefirst($_[1]),
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
return undef;
}
if (!defined($return) && defined($score))
{
Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
q{field_list},
$tracelevel)
if defined $::RD_TRACE;
$return = $score_return;
}
splice @{$thisparser->{errors}}, $err_at;
$return = $item[$#item] unless defined $return;
if (defined $::RD_TRACE)
{
Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
$return . q{])}, "",
q{field_list},
$tracelevel);
Parse::RecDescent::_trace(q{(consumed: [} .
Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
Parse::RecDescent::_tracefirst($text),
, q{field_list},
$tracelevel)
}
$_[1] = $text;
return $return;
}
# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
sub Parse::RecDescent::Parse::FieldPath::Parser::fields
{
my $thisparser = $_[0];
use vars q{$tracelevel};
local $tracelevel = ($tracelevel||0)+1;
$ERRORS = 0;
my $thisrule = $thisparser->{"rules"}{"fields"};
Parse::RecDescent::_trace(q{Trying rule: [fields]},
Parse::RecDescent::_tracefirst($_[1]),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
my $err_at = @{$thisparser->{errors}};
my $score;
my $score_return;
my $_tok;
my $return = undef;
my $_matched=0;
my $commit=0;
my @item = ();
my %item = ();
my $repeating = defined($_[2]) && $_[2];
my $_noactions = defined($_[3]) && $_[3];
my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
my %arg = ($#arg & 01) ? @arg : (@arg, undef);
my $text;
my $lastsep="";
my $current_match;
my $expectation = new Parse::RecDescent::Expectation(q{<leftop: field /,/ field>});
$expectation->at($_[1]);
my $thisline;
tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
while (!$_matched && !$commit)
{
Parse::RecDescent::_trace(q{Trying production: [<leftop: field /,/ field>]},
Parse::RecDescent::_tracefirst($_[1]),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[0];
$text = $_[1];
my $_savetext;
@item = (q{fields});
%item = (__RULE__ => q{fields});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying operator: [<leftop: field /,/ field>]},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$expectation->is(q{})->at($text);
$_tok = undef;
OPLOOP: while (1)
{
$repcount = 0;
my @item;
# MATCH LEFTARG
Parse::RecDescent::_trace(q{Trying subrule: [field]},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
if (1) { no strict qw{refs};
$expectation->is(q{field})->at($text);
unless (defined ($_tok = Parse::RecDescent::Parse::FieldPath::Parser::field($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
{
Parse::RecDescent::_trace(q{<<Didn't match subrule: [field]>>},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched subrule: [field]<< (return value: [}
. $_tok . q{]},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$item{q{field}} = $_tok;
push @item, $_tok;
}
$repcount++;
my $savetext = $text;
my $backtrack;
# MATCH (OP RIGHTARG)(s)
while ($repcount < 100000000)
{
$backtrack = 0;
Parse::RecDescent::_trace(q{Trying terminal: [/,/]}, Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$lastsep = "";
$expectation->is(q{/,/})->at($text);
unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:,)/)
{
$expectation->failed();
Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
last;
}
$current_match = substr($text, $-[0], $+[0] - $-[0]);
substr($text,0,length($current_match),q{});
Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
. $current_match . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $item{__PATTERN1__}=$current_match;
pop @item;
if (defined $1) {push @item, $item{'field(s)'}=$1; $backtrack=1;}
Parse::RecDescent::_trace(q{Trying subrule: [field]},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
if (1) { no strict qw{refs};
$expectation->is(q{field})->at($text);
unless (defined ($_tok = Parse::RecDescent::Parse::FieldPath::Parser::field($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
{
Parse::RecDescent::_trace(q{<<Didn't match subrule: [field]>>},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched subrule: [field]<< (return value: [}
. $_tok . q{]},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$item{q{field}} = $_tok;
push @item, $_tok;
}
$savetext = $text;
$repcount++;
}
$text = $savetext;
pop @item if $backtrack;
unless (@item) { undef $_tok; last }
$_tok = [ @item ];
last;
}
unless ($repcount>=1)
{
Parse::RecDescent::_trace(q{<<Didn't match operator: [<leftop: field /,/ field>]>>},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched operator: [<leftop: field /,/ field>]<< (return value: [}
. qq{@{$_tok||[]}} . q{]},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
push @item, $item{'field(s)'}=$_tok||[];
Parse::RecDescent::_trace(q{Trying action},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$_tok = ($_noactions) ? 0 : do {
use Hash::Merge qw//;
use List::Util qw//;
$return = List::Util::reduce { Hash::Merge::merge($a, $b) } {}, @{$item[1]};
};
unless (defined $_tok)
{
Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
if defined $::RD_TRACE;
last;
}
Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
. $_tok . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $_tok;
$item{__ACTION1__}=$_tok;
Parse::RecDescent::_trace(q{>>Matched production: [<leftop: field /,/ field>]<<},
Parse::RecDescent::_tracefirst($text),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
unless ( $_matched || defined($score) )
{
$_[1] = $text; # NOT SURE THIS IS NEEDED
Parse::RecDescent::_trace(q{<<Didn't match rule>>},
Parse::RecDescent::_tracefirst($_[1]),
q{fields},
$tracelevel)
if defined $::RD_TRACE;
return undef;
}
if (!defined($return) && defined($score))
{
Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
q{fields},
$tracelevel)
if defined $::RD_TRACE;
$return = $score_return;
}
splice @{$thisparser->{errors}}, $err_at;
$return = $item[$#item] unless defined $return;
if (defined $::RD_TRACE)
{
Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
$return . q{])}, "",
q{fields},
$tracelevel);
Parse::RecDescent::_trace(q{(consumed: [} .
Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
Parse::RecDescent::_tracefirst($text),
, q{fields},
$tracelevel)
}
$_[1] = $text;
return $return;
}
# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
sub Parse::RecDescent::Parse::FieldPath::Parser::parse
{
my $thisparser = $_[0];
use vars q{$tracelevel};
local $tracelevel = ($tracelevel||0)+1;
$ERRORS = 0;
my $thisrule = $thisparser->{"rules"}{"parse"};
Parse::RecDescent::_trace(q{Trying rule: [parse]},
Parse::RecDescent::_tracefirst($_[1]),
q{parse},
$tracelevel)
if defined $::RD_TRACE;
my $err_at = @{$thisparser->{errors}};
my $score;
my $score_return;
my $_tok;
my $return = undef;
my $_matched=0;
my $commit=0;
my @item = ();
my %item = ();
my $repeating = defined($_[2]) && $_[2];
my $_noactions = defined($_[3]) && $_[3];
my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
my %arg = ($#arg & 01) ? @arg : (@arg, undef);
my $text;
my $lastsep="";
my $current_match;
my $expectation = new Parse::RecDescent::Expectation(q{fields});
$expectation->at($_[1]);
my $thisline;
tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
while (!$_matched && !$commit)
{
Parse::RecDescent::_trace(q{Trying production: [fields /^\\Z/]},
Parse::RecDescent::_tracefirst($_[1]),
q{parse},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[0];
$text = $_[1];
my $_savetext;
@item = (q{parse});
%item = (__RULE__ => q{parse});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying subrule: [fields]},
Parse::RecDescent::_tracefirst($text),
q{parse},
$tracelevel)
if defined $::RD_TRACE;
if (1) { no strict qw{refs};
$expectation->is(q{})->at($text);
unless (defined ($_tok = Parse::RecDescent::Parse::FieldPath::Parser::fields($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
{
Parse::RecDescent::_trace(q{<<Didn't match subrule: [fields]>>},
Parse::RecDescent::_tracefirst($text),
q{parse},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched subrule: [fields]<< (return value: [}
. $_tok . q{]},
Parse::RecDescent::_tracefirst($text),
q{parse},
$tracelevel)
if defined $::RD_TRACE;
$item{q{fields}} = $_tok;
push @item, $_tok;
}
Parse::RecDescent::_trace(q{Trying terminal: [/^\\Z/]}, Parse::RecDescent::_tracefirst($text),
q{parse},
$tracelevel)
if defined $::RD_TRACE;
$lastsep = "";
$expectation->is(q{/^\\Z/})->at($text);
unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:^\Z)/)
{
$expectation->failed();
Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
last;
}
$current_match = substr($text, $-[0], $+[0] - $-[0]);
substr($text,0,length($current_match),q{});
Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
. $current_match . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $item{__PATTERN1__}=$current_match;
Parse::RecDescent::_trace(q{Trying action},
Parse::RecDescent::_tracefirst($text),
q{parse},
$tracelevel)
if defined $::RD_TRACE;
$_tok = ($_noactions) ? 0 : do {
$return = $item[1];
};
unless (defined $_tok)
{
Parse::RecDescent::_trace(q{<<Didn't match action>> (return value: [undef])})
if defined $::RD_TRACE;
last;
}
Parse::RecDescent::_trace(q{>>Matched action<< (return value: [}
. $_tok . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $_tok;
$item{__ACTION1__}=$_tok;
Parse::RecDescent::_trace(q{>>Matched production: [fields /^\\Z/]<<},
Parse::RecDescent::_tracefirst($text),
q{parse},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
unless ( $_matched || defined($score) )
{
$_[1] = $text; # NOT SURE THIS IS NEEDED
Parse::RecDescent::_trace(q{<<Didn't match rule>>},
Parse::RecDescent::_tracefirst($_[1]),
q{parse},
$tracelevel)
if defined $::RD_TRACE;
return undef;
}
if (!defined($return) && defined($score))
{
Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
q{parse},
$tracelevel)
if defined $::RD_TRACE;
$return = $score_return;
}
splice @{$thisparser->{errors}}, $err_at;
$return = $item[$#item] unless defined $return;
if (defined $::RD_TRACE)
{
Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
$return . q{])}, "",
q{parse},
$tracelevel);
Parse::RecDescent::_trace(q{(consumed: [} .
Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
Parse::RecDescent::_tracefirst($text),
, q{parse},
$tracelevel)
}
$_[1] = $text;
return $return;
}
# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
sub Parse::RecDescent::Parse::FieldPath::Parser::field_name
{
my $thisparser = $_[0];
use vars q{$tracelevel};
local $tracelevel = ($tracelevel||0)+1;
$ERRORS = 0;
my $thisrule = $thisparser->{"rules"}{"field_name"};
Parse::RecDescent::_trace(q{Trying rule: [field_name]},
Parse::RecDescent::_tracefirst($_[1]),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
my $err_at = @{$thisparser->{errors}};
my $score;
my $score_return;
my $_tok;
my $return = undef;
my $_matched=0;
my $commit=0;
my @item = ();
my %item = ();
my $repeating = defined($_[2]) && $_[2];
my $_noactions = defined($_[3]) && $_[3];
my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
my %arg = ($#arg & 01) ? @arg : (@arg, undef);
my $text;
my $lastsep="";
my $current_match;
my $expectation = new Parse::RecDescent::Expectation(q{/\\w+/, or '*', or ''});
$expectation->at($_[1]);
my $thisline;
tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
while (!$_matched && !$commit)
{
Parse::RecDescent::_trace(q{Trying production: [/\\w+/]},
Parse::RecDescent::_tracefirst($_[1]),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[0];
$text = $_[1];
my $_savetext;
@item = (q{field_name});
%item = (__RULE__ => q{field_name});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying terminal: [/\\w+/]}, Parse::RecDescent::_tracefirst($text),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
$lastsep = "";
$expectation->is(q{})->at($text);
unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A(?:\w+)/)
{
$expectation->failed();
Parse::RecDescent::_trace(q{<<Didn't match terminal>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
last;
}
$current_match = substr($text, $-[0], $+[0] - $-[0]);
substr($text,0,length($current_match),q{});
Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
. $current_match . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $item{__PATTERN1__}=$current_match;
Parse::RecDescent::_trace(q{>>Matched production: [/\\w+/]<<},
Parse::RecDescent::_tracefirst($text),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
while (!$_matched && !$commit)
{
Parse::RecDescent::_trace(q{Trying production: ['*']},
Parse::RecDescent::_tracefirst($_[1]),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[1];
$text = $_[1];
my $_savetext;
@item = (q{field_name});
%item = (__RULE__ => q{field_name});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying terminal: ['*']},
Parse::RecDescent::_tracefirst($text),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
$lastsep = "";
$expectation->is(q{})->at($text);
unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A\*/)
{
$expectation->failed();
Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
last;
}
$current_match = substr($text, $-[0], $+[0] - $-[0]);
substr($text,0,length($current_match),q{});
Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
. $current_match . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $item{__STRING1__}=$current_match;
Parse::RecDescent::_trace(q{>>Matched production: ['*']<<},
Parse::RecDescent::_tracefirst($text),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
while (!$_matched && !$commit)
{
Parse::RecDescent::_trace(q{Trying production: ['']},
Parse::RecDescent::_tracefirst($_[1]),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[2];
$text = $_[1];
my $_savetext;
@item = (q{field_name});
%item = (__RULE__ => q{field_name});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying terminal: ['']},
Parse::RecDescent::_tracefirst($text),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
$lastsep = "";
$expectation->is(q{})->at($text);
unless ($text =~ s/\A($skip)/$lastsep=$1 and ""/e and $text =~ m/\A/)
{
$expectation->failed();
Parse::RecDescent::_trace(qq{<<Didn't match terminal>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
last;
}
$current_match = substr($text, $-[0], $+[0] - $-[0]);
substr($text,0,length($current_match),q{});
Parse::RecDescent::_trace(q{>>Matched terminal<< (return value: [}
. $current_match . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
push @item, $item{__STRING1__}=$current_match;
Parse::RecDescent::_trace(q{>>Matched production: ['']<<},
Parse::RecDescent::_tracefirst($text),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
while (!$_matched)
{
Parse::RecDescent::_trace(q{Trying production: [<error?:...> <reject>]},
Parse::RecDescent::_tracefirst($_[1]),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[3];
my $_savetext;
@item = (q{field_name});
%item = (__RULE__ => q{field_name});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying directive: [<error?:...>]},
Parse::RecDescent::_tracefirst($text),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
$_tok = do { if ($commit) { do {
my $rule = $item[0];
$rule =~ s/_/ /g;
#WAS: Parse::RecDescent::_error("Invalid $rule: " . $expectation->message() ,$thisline);
push @{$thisparser->{errors}}, ["Invalid $rule: " . $expectation->message() ,$thisline];
} unless $_noactions; undef } else {0} };
if (defined($_tok))
{
Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [}
. $_tok . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
}
else
{
Parse::RecDescent::_trace(q{<<Didn't match directive>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
}
last unless defined $_tok;
push @item, $item{__DIRECTIVE1__}=$_tok;
Parse::RecDescent::_trace(q{>>Rejecting production<< (found <reject>)},
Parse::RecDescent::_tracefirst($text),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
undef $return;
$_tok = undef;
last unless defined $_tok;
Parse::RecDescent::_trace(q{>>Matched production: [<error?:...> <reject>]<<},
Parse::RecDescent::_tracefirst($text),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
unless ( $_matched || defined($score) )
{
$_[1] = $text; # NOT SURE THIS IS NEEDED
Parse::RecDescent::_trace(q{<<Didn't match rule>>},
Parse::RecDescent::_tracefirst($_[1]),
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
return undef;
}
if (!defined($return) && defined($score))
{
Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
q{field_name},
$tracelevel)
if defined $::RD_TRACE;
$return = $score_return;
}
splice @{$thisparser->{errors}}, $err_at;
$return = $item[$#item] unless defined $return;
if (defined $::RD_TRACE)
{
Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
$return . q{])}, "",
q{field_name},
$tracelevel);
Parse::RecDescent::_trace(q{(consumed: [} .
Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
Parse::RecDescent::_tracefirst($text),
, q{field_name},
$tracelevel)
}
$_[1] = $text;
return $return;
}
# ARGS ARE: ($parser, $text; $repeating, $_noactions, \@args)
sub Parse::RecDescent::Parse::FieldPath::Parser::field
{
my $thisparser = $_[0];
use vars q{$tracelevel};
local $tracelevel = ($tracelevel||0)+1;
$ERRORS = 0;
my $thisrule = $thisparser->{"rules"}{"field"};
Parse::RecDescent::_trace(q{Trying rule: [field]},
Parse::RecDescent::_tracefirst($_[1]),
q{field},
$tracelevel)
if defined $::RD_TRACE;
my $err_at = @{$thisparser->{errors}};
my $score;
my $score_return;
my $_tok;
my $return = undef;
my $_matched=0;
my $commit=0;
my @item = ();
my %item = ();
my $repeating = defined($_[2]) && $_[2];
my $_noactions = defined($_[3]) && $_[3];
my @arg = defined $_[4] ? @{ &{$_[4]} } : ();
my %arg = ($#arg & 01) ? @arg : (@arg, undef);
my $text;
my $lastsep="";
my $current_match;
my $expectation = new Parse::RecDescent::Expectation(q{field_list, or field_path});
$expectation->at($_[1]);
my $thisline;
tie $thisline, q{Parse::RecDescent::LineCounter}, \$text, $thisparser;
while (!$_matched && !$commit)
{
Parse::RecDescent::_trace(q{Trying production: [field_list]},
Parse::RecDescent::_tracefirst($_[1]),
q{field},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[0];
$text = $_[1];
my $_savetext;
@item = (q{field});
%item = (__RULE__ => q{field});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying subrule: [field_list]},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
if (1) { no strict qw{refs};
$expectation->is(q{})->at($text);
unless (defined ($_tok = Parse::RecDescent::Parse::FieldPath::Parser::field_list($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
{
Parse::RecDescent::_trace(q{<<Didn't match subrule: [field_list]>>},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched subrule: [field_list]<< (return value: [}
. $_tok . q{]},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
$item{q{field_list}} = $_tok;
push @item, $_tok;
}
Parse::RecDescent::_trace(q{>>Matched production: [field_list]<<},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
while (!$_matched && !$commit)
{
Parse::RecDescent::_trace(q{Trying production: [field_path]},
Parse::RecDescent::_tracefirst($_[1]),
q{field},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[1];
$text = $_[1];
my $_savetext;
@item = (q{field});
%item = (__RULE__ => q{field});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying subrule: [field_path]},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
if (1) { no strict qw{refs};
$expectation->is(q{})->at($text);
unless (defined ($_tok = Parse::RecDescent::Parse::FieldPath::Parser::field_path($thisparser,$text,$repeating,$_noactions,sub { \@arg })))
{
Parse::RecDescent::_trace(q{<<Didn't match subrule: [field_path]>>},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
$expectation->failed();
last;
}
Parse::RecDescent::_trace(q{>>Matched subrule: [field_path]<< (return value: [}
. $_tok . q{]},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
$item{q{field_path}} = $_tok;
push @item, $_tok;
}
Parse::RecDescent::_trace(q{>>Matched production: [field_path]<<},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
while (!$_matched)
{
Parse::RecDescent::_trace(q{Trying production: [<error...>]},
Parse::RecDescent::_tracefirst($_[1]),
q{field},
$tracelevel)
if defined $::RD_TRACE;
my $thisprod = $thisrule->{"prods"}[2];
my $_savetext;
@item = (q{field});
%item = (__RULE__ => q{field});
my $repcount = 0;
Parse::RecDescent::_trace(q{Trying directive: [<error...>]},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
$_tok = do { if (1) { do {
my $rule = $item[0];
$rule =~ s/_/ /g;
#WAS: Parse::RecDescent::_error("Invalid $rule: " . $expectation->message() ,$thisline);
push @{$thisparser->{errors}}, ["Invalid $rule: " . $expectation->message() ,$thisline];
} unless $_noactions; undef } else {0} };
if (defined($_tok))
{
Parse::RecDescent::_trace(q{>>Matched directive<< (return value: [}
. $_tok . q{])},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
}
else
{
Parse::RecDescent::_trace(q{<<Didn't match directive>>},
Parse::RecDescent::_tracefirst($text))
if defined $::RD_TRACE;
}
last unless defined $_tok;
push @item, $item{__DIRECTIVE1__}=$_tok;
Parse::RecDescent::_trace(q{>>Matched production: [<error...>]<<},
Parse::RecDescent::_tracefirst($text),
q{field},
$tracelevel)
if defined $::RD_TRACE;
$_matched = 1;
last;
}
unless ( $_matched || defined($score) )
{
$_[1] = $text; # NOT SURE THIS IS NEEDED
Parse::RecDescent::_trace(q{<<Didn't match rule>>},
Parse::RecDescent::_tracefirst($_[1]),
q{field},
$tracelevel)
if defined $::RD_TRACE;
return undef;
}
if (!defined($return) && defined($score))
{
Parse::RecDescent::_trace(q{>>Accepted scored production<<}, "",
q{field},
$tracelevel)
if defined $::RD_TRACE;
$return = $score_return;
}
splice @{$thisparser->{errors}}, $err_at;
$return = $item[$#item] unless defined $return;
if (defined $::RD_TRACE)
{
Parse::RecDescent::_trace(q{>>Matched rule<< (return value: [} .
$return . q{])}, "",
q{field},
$tracelevel);
Parse::RecDescent::_trace(q{(consumed: [} .
Parse::RecDescent::_tracemax(substr($_[1],0,-length($text))) . q{])},
Parse::RecDescent::_tracefirst($text),
, q{field},
$tracelevel)
}
$_[1] = $text;
return $return;
}
}
package Parse::FieldPath::Parser; sub new { my $self = bless( {
'_precompiled' => 1,
'localvars' => '',
'startcode' => '',
'namespace' => 'Parse::RecDescent::Parse::FieldPath::Parser',
'rules' => {
'field_path' => bless( {
'impcount' => 0,
'calls' => [
'field_name'
],
'changed' => 0,
'opcount' => 0,
'prods' => [
bless( {
'number' => '0',
'strcount' => 0,
'dircount' => 1,
'uncommit' => undef,
'error' => undef,
'patcount' => 1,
'actcount' => 1,
'op' => [],
'items' => [
bless( {
'expected' => '<leftop: field_name /\\\\// field_name>',
'min' => 1,
'name' => '\'field_name(s)\'',
'max' => 100000000,
'leftarg' => bless( {
'subrule' => 'field_name',
'matchrule' => 0,
'implicit' => undef,
'argcode' => undef,
'lookahead' => 0,
'line' => 31
}, 'Parse::RecDescent::Subrule' ),
'rightarg' => bless( {
'subrule' => 'field_name',
'matchrule' => 0,
'implicit' => undef,
'argcode' => undef,
'lookahead' => 0,
'line' => 31
}, 'Parse::RecDescent::Subrule' ),
'hashname' => '__DIRECTIVE1__',
'type' => 'leftop',
'op' => bless( {
'pattern' => '\\/',
'hashname' => '__PATTERN1__',
'description' => '/\\\\//',
'lookahead' => 0,
'rdelim' => '/',
'line' => 31,
'mod' => '',
'ldelim' => '/'
}, 'Parse::RecDescent::Token' )
}, 'Parse::RecDescent::Operator' ),
bless( {
'hashname' => '__ACTION1__',
'lookahead' => 0,
'line' => 32,
'code' => '{
use List::Util qw//;
# Turn qw/a b c/ into { a => { b => { c => {} } } }
my $fields = {};
List::Util::reduce { $a->{$b} = {} if $b } $fields, @{$item{\'field_name(s)\'}};
$return = $fields;
}'
}, 'Parse::RecDescent::Action' )
],
'line' => undef
}, 'Parse::RecDescent::Production' )
],
'name' => 'field_path',
'vars' => '',
'line' => 30
}, 'Parse::RecDescent::Rule' ),
'field_list' => bless( {
'impcount' => 0,
'calls' => [
'field_path',
'fields'
],
'changed' => 0,
'opcount' => 0,
'prods' => [
bless( {
'number' => '0',
'strcount' => 2,
'dircount' => 0,
'uncommit' => undef,
'error' => undef,
'patcount' => 0,
'actcount' => 1,
'items' => [
bless( {
'subrule' => 'field_path',
'matchrule' => 0,
'implicit' => undef,
'argcode' => undef,
'lookahead' => 0,
'line' => 17
}, 'Parse::RecDescent::Subrule' ),
bless( {
'pattern' => '(',
'hashname' => '__STRING1__',
'description' => '\'(\'',
'lookahead' => 0,
'line' => 17
}, 'Parse::RecDescent::Literal' ),
bless( {
'subrule' => 'fields',
'matchrule' => 0,
'implicit' => undef,
'argcode' => undef,
'lookahead' => 0,
'line' => 17
}, 'Parse::RecDescent::Subrule' ),
bless( {
'pattern' => ')',
'hashname' => '__STRING2__',
'description' => '\')\'',
'lookahead' => 0,
'line' => 17
}, 'Parse::RecDescent::Literal' ),
bless( {
'hashname' => '__ACTION1__',
'lookahead' => 0,
'line' => 18,
'code' => '{
sub deepest {
my $hashref = shift;
return $hashref if scalar(keys %$hashref) == 0;
my $key = (keys %$hashref)[0];
return deepest($hashref->{$key});
}
my $deepest = deepest($item{field_path});
$deepest->{$_} = $item{fields}->{$_} for keys %{$item{fields}};
$return = $item{field_path};
}'
}, 'Parse::RecDescent::Action' )
],
'line' => undef
}, 'Parse::RecDescent::Production' )
],
'name' => 'field_list',
'vars' => '',
'line' => 17
}, 'Parse::RecDescent::Rule' ),
'fields' => bless( {
'impcount' => 0,
'calls' => [
'field'
],
'changed' => 0,
'opcount' => 0,
'prods' => [
bless( {
'number' => '0',
'strcount' => 0,
'dircount' => 1,
'uncommit' => undef,
'error' => undef,
'patcount' => 1,
'actcount' => 1,
'op' => [],
'items' => [
bless( {
'expected' => '<leftop: field /,/ field>',
'min' => 1,
'name' => '\'field(s)\'',
'max' => 100000000,
'leftarg' => bless( {
'subrule' => 'field',
'matchrule' => 0,
'implicit' => undef,
'argcode' => undef,
'lookahead' => 0,
'line' => 7
}, 'Parse::RecDescent::Subrule' ),
'rightarg' => bless( {
'subrule' => 'field',
'matchrule' => 0,
'implicit' => undef,
'argcode' => undef,
'lookahead' => 0,
'line' => 7
}, 'Parse::RecDescent::Subrule' ),
'hashname' => '__DIRECTIVE1__',
'type' => 'leftop',
'op' => bless( {
'pattern' => ',',
'hashname' => '__PATTERN1__',
'description' => '/,/',
'lookahead' => 0,
'rdelim' => '/',
'line' => 7,
'mod' => '',
'ldelim' => '/'
}, 'Parse::RecDescent::Token' )
}, 'Parse::RecDescent::Operator' ),
bless( {
'hashname' => '__ACTION1__',
'lookahead' => 0,
'line' => 8,
'code' => '{
use Hash::Merge qw//;
use List::Util qw//;
$return = List::Util::reduce { Hash::Merge::merge($a, $b) } {}, @{$item[1]};
}'
}, 'Parse::RecDescent::Action' )
],
'line' => undef
}, 'Parse::RecDescent::Production' )
],
'name' => 'fields',
'vars' => '',
'line' => 7
}, 'Parse::RecDescent::Rule' ),
'parse' => bless( {
'impcount' => 0,
'calls' => [
'fields'
],
'changed' => 0,
'opcount' => 0,
'prods' => [
bless( {
'number' => '0',
'strcount' => 0,
'dircount' => 0,
'uncommit' => undef,
'error' => undef,
'patcount' => 1,
'actcount' => 1,
'items' => [
bless( {
'subrule' => 'fields',
'matchrule' => 0,
'implicit' => undef,
'argcode' => undef,
'lookahead' => 0,
'line' => 2
}, 'Parse::RecDescent::Subrule' ),
bless( {
'pattern' => '^\\Z',
'hashname' => '__PATTERN1__',
'description' => '/^\\\\Z/',
'lookahead' => 0,
'rdelim' => '/',
'line' => 2,
'mod' => '',
'ldelim' => '/'
}, 'Parse::RecDescent::Token' ),
bless( {
'hashname' => '__ACTION1__',
'lookahead' => 0,
'line' => 3,
'code' => '{
$return = $item[1];
}'
}, 'Parse::RecDescent::Action' )
],
'line' => undef
}, 'Parse::RecDescent::Production' )
],
'name' => 'parse',
'vars' => '',
'line' => 1
}, 'Parse::RecDescent::Rule' ),
'field_name' => bless( {
'impcount' => 0,
'calls' => [],
'changed' => 0,
'opcount' => 0,
'prods' => [
bless( {
'number' => '0',
'strcount' => 0,
'dircount' => 0,
'uncommit' => undef,
'error' => undef,
'patcount' => 1,
'actcount' => 0,
'items' => [
bless( {
'pattern' => '\\w+',
'hashname' => '__PATTERN1__',
'description' => '/\\\\w+/',
'lookahead' => 0,
'rdelim' => '/',
'line' => 16,
'mod' => '',
'ldelim' => '/'
}, 'Parse::RecDescent::Token' )
],
'line' => undef
}, 'Parse::RecDescent::Production' ),
bless( {
'number' => '1',
'strcount' => 1,
'dircount' => 0,
'uncommit' => undef,
'error' => undef,
'patcount' => 0,
'actcount' => 0,
'items' => [
bless( {
'pattern' => '*',
'hashname' => '__STRING1__',
'description' => '\'*\'',
'lookahead' => 0,
'line' => 16
}, 'Parse::RecDescent::Literal' )
],
'line' => 16
}, 'Parse::RecDescent::Production' ),
bless( {
'number' => '2',
'strcount' => 1,
'dircount' => 0,
'uncommit' => undef,
'error' => undef,
'patcount' => 0,
'actcount' => 0,
'items' => [
bless( {
'pattern' => '',
'hashname' => '__STRING1__',
'description' => '\'\'',
'lookahead' => 0,
'line' => 16
}, 'Parse::RecDescent::Literal' )
],
'line' => 16
}, 'Parse::RecDescent::Production' ),
bless( {
'number' => '3',
'strcount' => 0,
'dircount' => 1,
'uncommit' => 0,
'error' => 1,
'patcount' => 0,
'actcount' => 0,
'items' => [
bless( {
'msg' => '',
'hashname' => '__DIRECTIVE1__',
'commitonly' => '?',
'lookahead' => 0,
'line' => 16
}, 'Parse::RecDescent::Error' ),
bless( {
'name' => '<reject>',
'lookahead' => 0,
'line' => 0
}, 'Parse::RecDescent::UncondReject' )
],
'line' => 16
}, 'Parse::RecDescent::Production' )
],
'name' => 'field_name',
'vars' => '',
'line' => 16
}, 'Parse::RecDescent::Rule' ),
'field' => bless( {
'impcount' => 0,
'calls' => [
'field_list',
'field_path'
],
'changed' => 0,
'opcount' => 0,
'prods' => [
bless( {
'number' => '0',
'strcount' => 0,
'dircount' => 0,
'uncommit' => undef,
'error' => undef,
'patcount' => 0,
'actcount' => 0,
'items' => [
bless( {
'subrule' => 'field_list',
'matchrule' => 0,
'implicit' => undef,
'argcode' => undef,
'lookahead' => 0,
'line' => 14
}, 'Parse::RecDescent::Subrule' )
],
'line' => undef
}, 'Parse::RecDescent::Production' ),
bless( {
'number' => '1',
'strcount' => 0,
'dircount' => 0,
'uncommit' => undef,
'error' => undef,
'patcount' => 0,
'actcount' => 0,
'items' => [
bless( {
'subrule' => 'field_path',
'matchrule' => 0,
'implicit' => undef,
'argcode' => undef,
'lookahead' => 0,
'line' => 14
}, 'Parse::RecDescent::Subrule' )
],
'line' => 14
}, 'Parse::RecDescent::Production' ),
bless( {
'number' => '2',
'strcount' => 0,
'dircount' => 1,
'uncommit' => 0,
'error' => 1,
'patcount' => 0,
'actcount' => 0,
'items' => [
bless( {
'msg' => '',
'hashname' => '__DIRECTIVE1__',
'commitonly' => '',
'lookahead' => 0,
'line' => 14
}, 'Parse::RecDescent::Error' )
],
'line' => 14
}, 'Parse::RecDescent::Production' )
],
'name' => 'field',
'vars' => '',
'line' => 14
}, 'Parse::RecDescent::Rule' )
},
'_AUTOTREE' => undef,
'_check' => {
'thisoffset' => '',
'itempos' => '',
'prevoffset' => '',
'prevline' => '',
'prevcolumn' => '',
'thiscolumn' => ''
},
'_AUTOACTION' => undef
}, 'Parse::RecDescent' );
}