First off, thanks for answering so quickly.
SGLR the algorithm (to distinguish from any implementations) can produce parse forests as well. That’s what the G in GLR means. (in case you’re curious, the S stands for scannerless i.e. there’s no separate lexing phase)
That raises a question: how does GLL deal with left recursion, which LL(k) languages (and PEGs) are incapable of parsing due to infinite recursion?
This is cool, and reminds me of an idea I had to implement the concurrent version as a separate infix operator (tentative symbol: || ie. “parallel or”). That gives the language implementer the option to pay the extra cost where necessary, while avoiding unnecessary perf hits.
Now we’re talking! This is very nice, and I’d like a link to the paper if you have one.
You’re probably referring to the time spent building the parse table? Doesn’t GLL use anything like that? I mean, naively I’d say it’d have to in order to be able to memoize anything at all, but hey…
For a GLR impl that produces parse forests, have a look at JSGLR (as the name implies it’s written in Java, and as a research heavy project it’s absolutely not production ready, but it exists).
Yes and no. In principle you’re right of course, but (and I expect everyone here knows this) in practice runtime efficiency in time and space matters.