|
|
|
|
|
by sfvisser
2211 days ago
|
|
> * Error handling always ends up being non-existent or of the quality of "begin, for, if, while, repeat, identifier, number, float expected" with no good way to override what happens Probably true in many toy-versions. However parser combinators are very well suited for overriding the default expectation error messages with something custom. For example using a custom combinator `<?>` with low precedence. parseStatement :: Parser Statement
parseStatement = parseIf
<|> parseBlock
<|> parseWhile
<|> parseRepeat
<?> "statement"
No the parser won't enumerate all the options, but now can give you a high level expectation.> * Recovery is usually impossible There are a bunch of error correcting combinator libraries out there. Also, when using monadic combinators you can do all kinds of retrospective work while parsing. Probably more expensive, but entirely possible. Some pseudo Haskell example: parseHtmlBody :: Parser Html
parseHtmlBody =
do parseOpenTag "body"
contents <- parseHtml
tag <- tryParsingClosingTag "body"
when (tag /= "body") $
raiseWarning ("expected </body> seems like something else: " <> closing)
return contents
|
|