我想要做的事情看起来很简单,但由于我是一个 parsec Haskell 新手,所以我无法找到解决方案。
我有两个解析器,比如说 foo1
和 foo2
,其中 foo1
可以解析一个中间词,foo2
解析一个结束词。术语由符号 "."
分隔。
我需要解析的句子是
foo2
foo1.foo2
foo1.foo1.foo2
等等。
我原来的想法是做
do k <- sepBy foo1 (char'.')
j <- foo2
但这不会捕获
foo2
-only 的情况。 最佳答案
你想要 endBy
,而不是 sepBy
。
foo = do k <- foo1 `endBy` char '.'
j <- foo2
...
这将强制分隔符在每次出现
foo1
后出现。当然,
endBy
可以简单地替换为 many
,这可能更清楚。foo = do k <- many $ foo1 <* char '.'
j <- foo2
...
或者,没有
Control.Applicative
:foo = do k <- many $ do x <- foo1; char '.'; return x
j <- foo2
...
关于haskell - 使用 Parsec,我如何解析零个或多个以 foo2 结尾且全部以点分隔的 foo1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2373897/