> Problem is, your idea does NOT work for mutually left-recursive
> productions, only directly left-recursive productions.
>
Excellent catch. I had worried a bit about mutual recursion, but the
one test I tried worked. Interestingly, looking at the trace, there is
another reasonable point to pin the error on, which is:
enter Top @ 0 : ""
enter Choice @ 0 : ""
enter One @ 0 : ""
lookup Choice @ 0 : "" -> error
enter Base @ 0 : ""
exit Base @ 0 with match
lookup Base @ 0 : "base" -> match
exit One @ 0 with match
enter One @ 0 : "base"
lookup Choice @ 0 : "base" -> error
lookup Base @ 0 : "base" -> match
exit One @ 0 with match
lookup One @ 0 : "base" -> match
exit Choice @ 0 with match
enter Choice @ 0 : "base"
lookup One @ 0 : "base" -> match *****
exit Choice @ 0 with match
lookup Choice @ 0 : "base" -> match
exit Top @ 0 with error
The idea here is that the problem is could also be pinned on choice
using a memory that was formed during it's first time around, in it's
second time around. If for example, we were to clear the memory of
[EMAIL PROTECTED] before reentering choice, I think things would work out as
well.
> In other words, all productions that are mutually left-
> recursive need to share some state for the same input position, which
> complicates your scheme considerably.
This is very true. I'm noodling on a reasonable way to track things
to that cleans this up without adding too much additional complexity,
but it may turn out that the better strategy is just rule rewriting
ala the current Rats!.
It is still interesting that we may get some increase in expressivness
(at the cost of n^2 worst case of course). I realized that my earlier
example to parse "S = [ab] S [ab] | a" was slightly incorrect, the
better one is:
S = E / a;
E = E a [ab] \
E E [ab] \
[ab];
By the way, thanks to all for very useful feedback.
-Jeremy
_______________________________________________
PEG mailing list
[email protected]
https://lists.csail.mit.edu/mailman/listinfo/peg