私はLPegベースのパーサーを書いています。構文解析エラーがnil, errmsg
を返すようにするにはどうすればよいですか?LPegで解析エラーを通知するにはどうすればよいですか?
私は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
を返すようにしたいです。
あなたは何を達成しようとしていますか?それは最小の例ですか?あなたは '戻る'を試みましたか? – Jakuje
'error()'は 'nil、errmsg'の代わりにエラーを生成します。バックスラッシュエスケープでエラーが発生した場合、 'Line:match()'と 'Data:match()'を使って 'nil、errmsg'を返します。 – SoniEx2
@Jakuje実際には、無効なエスケープがあるときには 'Line:match()'だけで 'nil、errmsg'を返します。 – SoniEx2