Open
Description
Suppose we have the following parsers:
pInd, pB :: Parsec Void String String
pInd = indentGuard (hidden space) EQ (pos1 <> pos1) *> string "a"
pB = string "b" *> string "a"
If we try to parse the string "a"
with them we'll get the following errors (which seems to be good enough for me):
ghci> parseTest (pInd <* hidden eof) "a"
1:1:
|
1 | a
| ^
incorrect indentation (got 1, should be equal to 2)
ghci> parseTest (pB <* hidden eof) "a"
1:1:
|
1 | a
| ^
unexpected 'a'
expecting 'b'
However, if we'll try them as optional
, the second one preserve a useful error message:
ghci> parseTest (optional (try pB) <* hidden eof) "a"
1:1:
|
1 | a
| ^
unexpected 'a'
expecting 'b'
while the first loses it at all:
ghci> parseTest (optional (try pInd) <* hidden eof) "a"
1:1:
|
1 | a
| ^
unexpected 'a'
Why megaparsec behaves so? Are there places where preserving indentation error is undesirable or maybe I'm using wrong combinators here?