It make *lots* of sense and I've considered it as a feature in R3. It will never happen in R2 -- it'd be a massive risky change and R2 is stable.
Incidentally, a limited implementation of it is how LATM lexing works. As a special case, I selectively turn on and off predictions in Earley set 0 of the lexer. On Wed, Aug 8, 2018 at 2:31 PM, Michael Spertus <[email protected]> wrote: > Thanks for the link, Amon. As I suspected, it says you should travers the > ASF in such cases... > > In a related question, is there any way for me to reject a rule during the > read() by listening for a prediction/completion events? A number of my > rules have conditions on their arguments that are known not to be > BNF-friendly. I know I can bail from those in a semantic action, but I > would like to reject before an exponential explosion in the number of > ambiguous parses. Does that make sense? > > Thanks, > > Mike > > > On Wednesday, August 8, 2018 at 12:01:24 AM UTC-7, amon wrote: > >> 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. > -- 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.
