[Haskell-cafe] Reason about a Megaparsec error
jaro.reinders at gmail.com
Sun Oct 25 11:07:23 UTC 2020
But in the basic.txt example, won't the first nbsc consume everything up to
'method doXXX() pass'. Then the semicolon parser consumes the 'm' character,
and that will never backtrack. So that 'm' character is lost.
On 10/25/20 12:00 PM, YueCompl wrote:
> During the parsing of doc comments, backtracking is off on purpose, as it won't consume syntactic contents, merely whitespaces (while doc comment is a special form of block comment), the desired result is `Nothing` or `Just docCmt` without backtracking of whitespaces.
>> On 2020-10-25, at 18:53, Jaro Reinders <jaro.reinders at gmail.com> wrote:
>> I think you have to insert a 'try' manually inside the optional, because megaparsec doesn't do backtracking by default.
>> On 10/25/20 11:27 AM, YueCompl via Haskell-Cafe wrote:
>>> Dear Cafe,
>>> I find myself unable to reason about an error that `optional` in a parser err out instead of return Nothing, I asked the question at StackOverflow, and would like to seek your help here as well.
>>> https://stackoverflow.com/questions/64522568/why-optional-in-a-parser-can-err-out <https://stackoverflow.com/questions/64522568/why-optional-in-a-parser-can-err-out>
>>> https://github.com/complyue/dcp <https://github.com/complyue/dcp> is a minimum working example to reprod this error
>>> $ cabal run dcp:dcp < samples/basic.txt
>>> Up to date
>>> dcp: 10:1:
>>> 10 | method doXXX() pass
>>> | ^
>>> unexpected 'm'
>>> expecting ';'
>>> CallStack (from HasCallStack):
>>> error, called at src/Parser.hs:149:14 in main:Parser
>>> I believe it's optionalSemicolon causing the failure:
>>> https://github.com/complyue/dcp/blob/1df7ad590d78d4fa9a017eb53f9f265e291bdfa7/src/Parser.hs#L50-L54 <https://github.com/complyue/dcp/blob/1df7ad590d78d4fa9a017eb53f9f265e291bdfa7/src/Parser.hs#L50-L54>
>>> findIt = do
>>> -- ignore leading whitespaces and an optional semicolon in between
>>> nbsc >> optionalSemicolon >> nbsc
>>> -- try get a doc comment block
>>> getIt >>= \case
>>> And it's defined like this: https://github.com/complyue/dcp/blob/1df7ad590d78d4fa9a017eb53f9f265e291bdfa7/src/Parser.hs#L31-L32 <https://github.com/complyue/dcp/blob/1df7ad590d78d4fa9a017eb53f9f265e291bdfa7/src/Parser.hs#L31-L32>
>>> optionalSemicolon :: Parser Bool
>>> optionalSemicolon = fromMaybe False <$> optional (True <$ symbol ";")
>>> I can't reason about why it can fail like this.
>>> Best regards,
>>> Haskell-Cafe mailing list
>>> To (un)subscribe, modify options or view archives go to:
>>> Only members subscribed via the mailman list are allowed to post.
>> Haskell-Cafe mailing list
>> To (un)subscribe, modify options or view archives go to:
>> Only members subscribed via the mailman list are allowed to post.
More information about the Haskell-Cafe