微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在解析器中消耗一些输入后如何编码* 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 举报,一经查实,本站将立刻删除。