That breaks the ability to easily PreCompile (which is rather major) because the user must provide AddHash and the user must be main::. Breaking encapsulation in this fashion also prevents more than one instance of the parser from being used at a time. Fix:
use strict; use warnings; use Parse::RecDescent (); use Data::Dumper qw( Dumper ); my $grammar = <<'__END_OF_GRAMMAR__'; { use strict; use warnings; } test : <rulevar: local %data > | expr(s) /^\Z/ { \%data } expr : name '=' /\d+/ { $data{ $item{name} } = $item[-1]; 1 } name : /\w+/ __END_OF_GRAMMAR__ my $parser = new Parse::RecDescent($grammar) or die; my $data = $parser->test("x = 1 y = 2 z = 3") or die; print Dumper $data;
( Note: I prefer the solution I posted last night because it doesn't break if backtracking occurs like this one and this one's parent do. )
In reply to Re^2: How do I return a hash from Parse::RecDescent?
by ikegami
in thread How do I return a hash from Parse::RecDescent?
by GrandFather
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |