I once felt that every time I think LPEG is the solution to my problem I spend so much time trying to learn it that I lose focus from the actual problem.
The concept is admirable, though, so for once I decided to struggle through and actually get the job done using it. I learned a few tricks along the way, so I decided I should write them down (because I know I’ll certainly need them in the future).
These assume the one-letter functions are loaded into locals (e.g.
P = lpeg.P).
Match a pattern exactly n times
local function X(p,n) return n == 1 and p or p * X(p,n-1) end
Match anything not in a set
(1 - S"abc") -- [^abc]
Match a string converting backslash escape sequences
-- match backslash and capture following char, -- then convert match to captured char local escape = (P"\" * C(1)) / "%1" -- match anything but backslashes and spaces, or escapes -- turn everything into a capture, replacing inner captures local pathname = Cs( ( (1 - S"\ ") + escape ) ^ 1 )
Capture a number as a number
local num = (R"09" ^ 1) / tonumber