Hi everyone,

Here's another way to achieve left-recursion/associativity/precedence
handling with PEGs, to appear in SLE 2015:
https://drive.google.com/file/d/0B0O9lcl5dMLQSzJqUWFzbzl2X0U/view?usp=sharing

Algorithm 1 & 2 is what you're looking for. It's adapted from a technique
developed here: http://chrisseaton.com/katahdin/

And the implementation: https://github.com/norswap/autumn

I was going to wait until I had a nice user manual before making an
announcement, but since the topic came up, this is a good a time as any :)

Nicolas LAURENT

On Tue, Sep 8, 2015 at 4:06 PM, Sérgio Medeiros <sqmedei...@gmail.com>
wrote:

> On Mon, Sep 7, 2015 at 6:27 PM, Nikita Nemkin <nik...@nemkin.ru> wrote:
> > I wonder if someone could help me with a certain assertion made in this
> > paper: http://arxiv.org/abs/1207.0443v3 (Medeiros, Mascarenhas,
> > Ierusalimschy. "Left Recursion in Parsing Expression Grammars" v3).
> >
> > The last paragraph on p.14:
> >
> > > We could impose left-associativity as the default in case of a grammar
> that
> > > mixes left and right recursion just by changing k ≥ k' in rule lvar.4
> to k > k'
> > > and by changing k < k' in rule lvar.5 to k ≤ k'. The disadvantage is
> that this
> > > makes specifying precedence levels with right-associative operators a
> little
> > > harder
> >
> > I can't see how it's supposed to work. Consider this grammar:
> >
> >     E = E[1] "+" E[1] / "n"
> >
> > where [1] is precedence and the initial precedence is also 1.
> >
> > Default precedence check is "fail if current rule precedence <= memoized
> > precedence," leading to right associative parse tree, as expected.
> >
> > Modified precedence check is "fail if current rule precedence < memoized
> > precedence" and it does NOT lead to left associativity. Instead,
> recursive
> > E[1] invocation always fails due to precedence check, reducing the
> grammar
> > to E = "n" "+" "n" / "n".
>
> It seems that when you say "precedence check" you are referring to rule
> lvar.5. I think the default precedence check (rule lvar.5 on page 15) is
> "fail if current rule precedence < memoized precedence".
>
> I think the key point is that all left-recursive invocations of E (unless
> the first one)
> will occur after a right-recursive invocation of E. When this
> left-recursive invocation
> of E after a right-recursive one matches as much as possible we will have a
> a right-associative '+'.  The result would be E[E[n] + E[E[n] + E[n]]]
>
> The default semantics allows this, because rule lvar.4 can be used as long
> as both
> E's have the same precedence.
>
> By chaning rule lvar.4 as suggested the left-recursive E after a right
> recursive E
> only matches "n", which gives us a left-associative '+'. The result would
> be E[E[E[n] + E[n]] + E[n]].
>
> I hope this helps.
>
> Sérgio
>
>
>
>
> _______________________________________________
> 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

Reply via email to