|
I did a patch that use B(-n) for the behind n instruction (no matching) NOTE: %b == lpeg.B(-1) == lpeg.pcode behind 1 Example: capture chars in groups of 3's Example: lua patten "(.*)and(.*)" pat = re.compile "{(g <- 'and' / . [^a]* g)+ %b%b%b} ... {.*}" Above example, but does TRUE greedy match (stop on first match) The re pattern is tail recursive. No backtrack stack overflow ! For long string, this is faster than lua string.match ! pat = re.compile "{ .* %b%b%b (g <- &'and' / .%b%b g) .^3 {.*}" lpeg error system check for infinite recursion, i trick it by using .%b%b instead of %b If anyone know how to fix it, please let me know ---- Follwing is the patches if anyone interested (4 files, total 5 lines) >diff lpeg\lptree.c lpeg-1.0.1\lptree.c 430d429 < tree->u.n = n; // possibly lpeg.B(-n) 689d687 < if (sib1(tree)->tag == TNot) n = sib1(tree)->u.n; >diff lpeg\lpcode.c lpeg-1.0.1\lpcode.c 661d661 < if (sib1(tree)->tag != TNot) // lpeg.B(-n) = behind n >diff lpeg\lpprint.c lpeg-1.0.1\lpprint.c 185d184 < if (sib1(tree)->tag != TNot) // lpeg.B(-n) = behind n >diff lpeg\re.lua lpeg-1.0.1\re.lua 23c27,28 < local Predef = { nl = m.P"\n", b = m.B(-1) } --- > local Predef = { nl = m.P"\n" } |