Your grammar as written is ambiguous and therefore Marpa gives you all
parses in an unspecified order – to see them, iterate over the value
like

while (my $ref = $recce->value) {
    print Dumper $$ref;
}

Marpa's ranks are a bit unintuitive, I previously ran into very
similar problems. This lead to the Marpa::R2::Semantics::Rank
document[1] being written (Thanks Jeffrey!). That document shows a
related example. The solution seems to be to spell out the sequence
rule explicitly:

statements ::= xy rank => 1
statements ::= x
statements ::= y
statements ::= statements xy rank => 1
statements ::= statements x
statements ::= statements y

The docs emphasize: “The rank of a parse choice is the rank of the
rule of its cause”, which suggests the problem is the intermediate
statement rule. If I understand correctly, the "statements ::=
statement+" sequence rule has no choices because it always gets a
statement at each position (not a choice between x and xy). And the
rank within statement does not matter because … I still don't
understand this 100%.

[1]: 
https://metacpan.org/pod/release/JKEGL/Marpa-R2-5.043_043/pod/Semantics/Rank.pod

On Wed, 8 Aug 2018 at 07:33, Michael Spertus <[email protected]> wrote:
>
> This time with attachment :/
>
> On Wednesday, August 8, 2018 at 12:20:39 AM UTC-5, Michael Spertus wrote:
>>
>> Thanks for helping me to get to a (surprising) answer to my previous 
>> question. I was hoping you could help me with another. I want the following 
>> grammar to parse 'xy' as a single statement
>>
>>> statements ::= statement+
>>> statement ::= xy | x | y
>>> x ::= 'x'
>>> y ::= 'y'
>>> xy ::= 'x' 'y'
>>>
>>
>> Unfortunately, it always parses as two statements, even if I use the 
>> attached "high_rule_only" code and rank the statement alternatives as
>>
>>>  statement ::= xy rank => 1 | x | y
>>
>>
>> I still get two statements. Is there a way I can do this with ordering, or 
>> do I need to do something like traverse the ASF? Note that I need to do this 
>> at the ::= level rather than with lexemes because in the actual grammar I 
>> care about x and y are complicated rules themselves.
>>
>> Thanks,
>> Mike
>>
> --
> 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.

-- 
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