[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: LPeg parsing errors (Re: A Review of MoonScript 0.2.0)
- From: David Kolf <kolf@...>
- Date: Sun, 01 Jan 2012 13:26:12 +0100
Alex Bradbury wrote:
On 15 December 2011 10:46, steve donovan<steve.j.donovan@gmail.com> wrote:
Still immature, of course; languages take time and getting good error
messages out of LPeg grammars is a bit of an art.
When playing with lpeg grammars that's always been the part I've found
less easy (and of course the part which is easiest to just ignore).
Does anyone know of any lpeg examples which do a particularly good job
of this?
This thread is a bit old by now, but for my JSON parser
<http://chiselapp.com/user/dhkolf/repository/dkjson/> I used match-time
captures to generate error messages. The error message is saved in a
state table which is passed as argument to the match function.
local function loc (str, where)
local line, pos, linepos = 1, 1, 1
while true do
pos = strfind (str, "\n", pos, true)
if pos and pos < where then
line = line + 1
linepos = pos
pos = pos + 1
else
break
end
end
return "line " .. line .. ", column " .. (where - linepos)
end
local g = require ("lpeg")
local P, S, R, V = g.P, g.S, g.R, g.V
local function ErrorCall (str, pos, msg, state)
if not state.msg then
state.msg = msg .. " at " .. loc (str, pos)
state.pos = pos
end
return false
end
local function Err (msg)
return g.Cmt (g.Cc (msg) * g.Carg (2), ErrorCall)
end
-- Usage examples:
local EscapeSequence =
(P"\\" * g.C (S"\"\\/bfnrt" + Err "unsupported escape sequence")) /
escapechars
local String = P"\"" * g.Cs (Char ^ 0) * (P"\"" +
Err "unterminated string")
local Pair = g.Cg (Space * String * Space * (P":" +
Err "colon expected") * ExpectedValue)