On Sun, Dec 14, 2014 at 6:14 PM, Sean Conner
<sean@conman.org> wrote:
The rules I use for this type of thing look like:
re = require "re" -- it's still part of LPeg.
-- and I find it easier to follow the grammar
parser = re.compile [[
expr <- term (termop term)*
term <- factor (factorop factor)*
factor <- number / open expr close
space <- %s*
number <- space {'-'^-1 [0-9]^+1} space
termop <- space {[+-]} space
factorop <- space {[*/]} space
open <- space '(' space
close <- space ')' space
]]
I'm glad you posted this! Someone, somewhere, is going to search for 'left recursion lpeg' and solve their problem.
I've been merrily rewriting my grammar and am pleased to find it's working. My issue is that lpeg won't pass a valid grammar because empty-return propagation doesn't account for the predicate in #patt. I think this should change, the additional complexity to the library is at compile-time.
The grammar, as written, will not loop, and the compiler can reason through the call chain, just like we do, to confirm that.