The return value of undef from $slr->value() means "No parse" -- in other words failure. If the value of the parse was an undef, a reference to an undef would be returned.

$slr->read() pauses instead of failing, because you could in theory extend the input. Marpa allows you to jump around in the input, or backtrack over it, so Marpa can never really consider an input string to be "exhausted". Parses get exhausted because it can be impossible for them to continue. But with a Marpa input, you can backtrack over it forever. Of course, there's no "3" in your string, so even backtracking can't produce a successful parse with this particular string, but Marpa does not try to be *that* smart.

Provision for tricky features does complicate the interface a bit, but it pays off when you need that tricky feature.

Hope this helps, jeffrey

On 05/08/2014 10:08 AM, [email protected] wrote:
First off I'm a new user trying to understand the Marpa module. It's been a difficult ride thus far as I come from the regex side with no experience in lexing vs. parsing prior to Marpa. The below questions here are essentially crossposted from here (http://www.perlmonks.org/?node_id=1085393) but as they're very Marpa specific, I thought this might be a better place to ask.

I am trying to understand how Marpa handles the case where the input string matches the grammar, but only partially. All of the input string matches the grammar to the point of input string exhaustion, but there are remaining non-optional tokens in the grammar that are not yet matched. Here's the test case I've been using to illustrate the issue:

use strict; use warnings; use Marpa::R2; use Data::Dumper; # Example 1 { my $g_str = <<'END_GRAMMAR'; :default ::= action => [name, value] :start ::= data data ::= '12' '3' END_GRAMMAR my $g_obj = Marpa::R2::Scanless::G->new({ source => \$g_str }); my $p_obj = Marpa::R2::Scanless::R->new({ grammar => $g_obj, trace_values => 1, trace_terminals => 1 }); my $s = '123'; $p_obj->read( \$s ); print "EXAMPLE 1 VALUE:".Dumper($p_obj->value)."\n"; } # Example 2 { my $g_str = <<'END_GRAMMAR'; :default ::= action => [name, value] :start ::= data data ::= '12' '3' END_GRAMMAR my $g_obj = Marpa::R2::Scanless::G->new({ source => \$g_str }); my $p_obj = Marpa::R2::Scanless::R->new({ grammar => $g_obj, trace_values => 1, trace_terminals => 1 }); my $s = '12'; $p_obj->read( \$s ); print "EXAMPLE 2 VALUE:".Dumper($p_obj->value)."\n"; }

Output:

Setting trace_terminals option Setting trace_values option Lexer "L0" accepted lexeme L1c1-2: '12'; value="12" Lexer "L0" accepted lexeme L1c3: '3'; value="3" EXAMPLE 1 VALUE:$VAR1 = \[ 'data', '12', '3' ]; Setting trace_terminals option Setting trace_values option Lexer "L0" accepted lexeme L1c1-2: '12'; value="12" EXAMPLE 2 VALUE:$VAR1 = undef;

In both examples, the grammar has a single 'data' token that requires a '12' and a '3' token to match. In example 1, both tokens are matched and the call to the recognizer object's read method returns the expected data structure.

However, in example two, the input string is only long enough to match the first '12' token. It cannot match the '3' token required for 'data'. Intuitively, I would expect the recognizer object's read method to fail in this case, but it does not. It seems that read does not fail in a case where the input string is entirely exhausted while attempting to match the grammar. I am assuming this is an intentional behavior and have attempted to read through the documentation to understand this issue, but have failed so far. Amon over at PerlMonks has been very helpful so far, but I feel this might be a better place for this question.

--
You received this message because you are subscribed to the Google Groups "marpa parser" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "marpa 
parser" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to