在解析器中消耗一些输入后如何编码* NoMatch *

问题描述

也作为Megaparsec问题在https://github.com/mrkkrp/megaparsec/issues/429上问过

正如我所观察到的(不知道规范定义可以在哪里生存),解析器组合器的约定:

  • fail(不消耗任何输入)将尝试另一种可能成功的尝试
  • fail消耗了一些输入后,无论其他选择如何,都会立即出错

我对这些规则正确吗?此类规则的官方说明在哪里?

然后我想,empty解析器的结果即使在消耗了一些输入之后仍可能表示 NoMatch ,并且想利用这种语义,但是当前实现https://github.com/complyue/dcp/blob/5be688396b7e2bda00ea80fd99d2a7b3ec5c788d/src/Parser.hs#L138-L146遇到了错误

artifactDecl :: Parser ArtDecl
artifactDecl = do
  artCmt <- immediateDocComments
  (eof >> empty) <|> do
    artBody <- takeWhileP (Just "artifact body")
                          (not . flip elem (";{" :: [Char]))
    if T.null $ T.strip artBody
      then empty -- this is not possible in real cases
      else return (artCmt,artBody)
$ cabal run dcp < samples/full.txt
Up to date
dcp: 73:1:
   |
73 | <empty line>
   | ^
expecting "{#","{##",or artifact body

CallStack (from HasCallStack):
  error,called at src/Parser.hs:151:14 in main:Parser

那我该如何实现呢?

背景是我正在尝试对文档注释解析的实现进行原型设计,如https://github.com/mrkkrp/megaparsec/issues/428

中所述

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)