我试图调试为什么尽管将optionMaybe
与try
结合使用,但是parsec正在消耗输入。基本上在下面的代码中,为什么第二次运行不返回Right "abc"
(这是我期望的)?
鉴于
myParser = do
optionMaybe $ try (between (char '/') (char '/') $ many1 (noneOf "/")
many1 (noneOf "/")
我得到了
> parse myParser "" "/abc/def"
Right "def"
> parse myParser "" "/abc"
Left (line 1, column 5):
unexpected end of input
expecting "/"
答案 0 :(得分:3)
由于between (char '/') (char '/') $ many1 (noneOf "/")
中缺少结束'/'
,整个"/abc"
失败,因此optionMaybe $ try $ between ...
不会消耗任何内容(并导致Nothing
)。您留下了输入的所有"/abc"
,这当然与剩余的解析器many1 (noneOf "/")
不匹配。