Ich schreibe einen LPeg-basierten Parser. Wie kann ich es so machen, dass ein Parsing-Fehler nil, errmsg
zurückgibt?Wie kann ich Parsing-Fehler mit LPeg signalisieren?
Ich weiß, ich kann error()
verwenden, aber soweit ich weiß, dass ein normaler Fehler erstellt, nicht nil, errmsg
.
Der Code ist pretty long, aber der relevante Teil ist dies:
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()
ich Line:match(...)
wollen nil, errmsg
zurückzukehren, wenn eine ungültige Flucht ist.
was versuchen Sie zu erreichen? Ist es ein minimales Beispiel? Hast du versucht zurück zu kommen? – Jakuje
Die 'error()' erzeugt einen Fehler anstelle von 'nil, errmsg'. Ich will 'Line: match()' und 'Data: match()', um 'nil, errmsg' zurückzugeben, wenn ein Fehler bei Backslash-Escapes auftritt. – SoniEx2
@Jakuje Eigentlich brauche ich nur 'Line: match()', um 'nil, errmsg' zurückzugeben, wenn ein ungültiges Escape vorliegt. – SoniEx2