If I do remember correctly, the original OMeta formulation of the "growing the seed" approach was inconsistent, in that rules that were only left-recursive would be parsed left-associative (of course) but rules that were both left- and right-recursive would be parsed right-associative. It's debatable if that's really "inconsistent" though.
Anyhow, it's not too hard to change the algorithm to allow for either left- or right-associativity. Users should be given the choice! You can find the algorithm in this paper (Algorithm 1 on page 4 is what you're looking for): http://norswap.com/pubs/sle2015.pdf Cheers! Nicolas LAURENT On 26 March 2018 at 09:26, Johan Thiborg-Ericson < johan.thiborg.eric...@gmail.com> wrote: > Oups, duplicate: https://lists.csail.mit.edu/pipermail/peg/ > 2010-November/000319.html > You may remove my thread. > > 2018-03-26 8:42 GMT+02:00 Johan Thiborg-Ericson < > johan.thiborg.eric...@gmail.com>: > >> Hello everyone, >> >> As you know, one of the greatest benefits of PEGs over CFGs is that the >> former is deterministic. This means that even if two alternatives could >> recognize the same string (or even the same language), one can rely on that >> the parser will always choose the alternative you have specified first. >> >> start <- A B / C >> A <- a >> B <- b >> C <- ab >> >> will always return an AST of a sequence of an A and a B node, never a C >> node with the value "ab". >> >> There are a number of algorithms that extends PEGs to support left >> recursion, but do they agree on how ordered choice should be interpreted if >> one of the alternatives is left recursive? The situation I am thinking of: >> >> A <- A a / a A / empty >> >> While the first and second alternative describe the same language, a >> sequence of zero or more a:s, we would expect it to return a parse tree >> with left associativity, that is >> >> (((...((a)a)...)a)a) >> >> and not >> >> (a(a(...(a(a))...))) >> >> as suggested by the second alternative, since intiutively, a PEG should >> prefer the first alternative of an ordered choice, even if the first choice >> is defined in a left recursive way. >> >> However, packrat parsers implementing left recursion through "growing a >> seed parse", in the style of Warth et. al.:s algorithm, would skip the left >> recursive first choice in wait for a seed parse. Then the right recursive >> second alternative would consume all the a:s, skipping the left recursive >> case at each position. On the way back up the stack, each left >> recursive case would be tried, parsing all the a:s as a seed parse and >> failing to parse one more, getting a memoized value of equal length for the >> second alternative. It won't be reparsed since it is only part of left >> recursive definitions at later positions. And then empty will be ignored >> since it consumes less positions. >> >> So all left recursions will fail, since their seed parse, the right >> recursion, have already consumed all the a:s, leaving no trailing a for the >> left recursive alternative to succeed on. That way we end up with an >> unintuitive right-associative AST, although the left recursive alternative >> was clearly the prioritized option. >> >> Clearly, this example would not cause much trouble in practice, but are >> there any languages that would? >> Is there any algorithm that "solves" this situation? >> Is there any research regarding the interpretation of ordered choice in >> PEGs with left recursive definitions? >> >> Sincerely, Johan Thiborg-Ericson >> >> P. S. >> I'm new in this mailing list and to mailing lists as a concept. If I am >> doing anything wrong, please tell me :) >> D. S. >> > > > _______________________________________________ > PEG mailing list > PEG@lists.csail.mit.edu > https://lists.csail.mit.edu/mailman/listinfo/peg > >
_______________________________________________ PEG mailing list PEG@lists.csail.mit.edu https://lists.csail.mit.edu/mailman/listinfo/peg