我想要做的事情看起来很简单,但由于我是一个 parsec Haskell 新手,所以我无法找到解决方案。

我有两个解析器,比如说 foo1foo2,其中 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/

    10-12 16:45