【发布时间】:2016-12-04 12:36:04
【问题描述】:
我正在编写一个基于 LPeg 的解析器。我怎样才能让它解析错误返回nil, errmsg?
我知道我可以使用error(),但据我所知,这会产生正常错误,而不是nil, errmsg。
代码是pretty long,但相关部分是这样的:
local eof = lpeg.P(-1)
local nl = (lpeg.P "\r")^-1 * lpeg.P "\n" + lpeg.P "\\n" + eof -- \r for winblows compat
local nlnoeof = (lpeg.P "\r")^-1 * lpeg.P "\n" + lpeg.P "\\n"
local ws = lpeg.S(" \t")
local inlineComment = lpeg.P("`") * (1 - (lpeg.S("`") + nl * nl)) ^ 0 * lpeg.P("`")
local wsc = ws + inlineComment -- comments count as whitespace
local backslashEscaped
= lpeg.P("\\ ") / " " -- escaped spaces
+ lpeg.P("\\\\") / "\\" -- escaped escape character
+ lpeg.P("\\#") / "#"
+ lpeg.P("\\>") / ">"
+ lpeg.P("\\`") / "`"
+ lpeg.P("\\n") -- \\n newlines count as backslash escaped
+ lpeg.P("\\") * lpeg.P(function(_, i)
error("Unknown backslash escape at position " .. i) -- this error() is what I wanna get rid of.
end)
local Line = lpeg.C((wsc + (backslashEscaped + 1 - nl))^0) / function(x) return x end * nl * lpeg.Cp()
我希望Line:match(...) 在出现无效转义时返回nil, errmsg。
【问题讨论】:
-
你想达到什么目的?这是最小的例子吗?你试过
return吗? -
error()产生错误而不是nil, errmsg。如果反斜杠转义出现错误,我希望Line:match()和Data:match()返回nil, errmsg。 -
@Jakuje 实际上,我只需要
Line:match()在出现无效转义时返回nil, errmsg。
标签: error-handling lua lpeg