Thanks for the response Jeffrey. That would be awesome. Consider this a vote for early bailing (Earley bailing?) in R3.
Mike On Wednesday, August 8, 2018 at 1:40:47 PM UTC-5, Jeffrey Kegler wrote: > > 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] > <javascript:>> 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] <javascript:>. >> 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.
