问题描述
也作为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 (将#修改为@)