Haskell 使用Parsec,我如何解析零个或多个以foo2结尾并以点分隔的foo1?

Haskell 使用Parsec,我如何解析零个或多个以foo2结尾并以点分隔的foo1?,haskell,parsec,Haskell,Parsec,我试图做的事情似乎很简单,但由于我是一名parsec Haskell新手,解决方案就在我眼前 我有两个解析器,比如说foo1和foo2,其中foo1可以解析中间词,而foo2可以解析结束词。术语由符号“”分隔 我需要分析的句子是 foo2 foo1.foo2 foo1.foo1.foo2 等等 我最初的想法是 do k <- sepBy foo1 (char'.') j <- foo2 Dok试试下面的方法 many (foo1 >>= (\v -> c

我试图做的事情似乎很简单,但由于我是一名parsec Haskell新手,解决方案就在我眼前

我有两个解析器,比如说
foo1
foo2
,其中
foo1
可以解析中间词,而
foo2
可以解析结束词。术语由符号“
”分隔

我需要分析的句子是

  • foo2
  • foo1.foo2
  • foo1.foo1.foo2
等等

我最初的想法是

do k <- sepBy foo1 (char'.')
   j <- foo2
Dok试试下面的方法

many (foo1 >>= (\v -> char '.' >> return v)) >>= \v1 ->
  foo2 >>= \v2 ->
  -- ...
  -- combine v1 & v2 somehow
(当然,只是一张草图。)


一般来说,
many
组合符是Parsec的等价物;如果你想在现有的解析器中添加一些简单的东西,比如一个尾随点,那么使用
>/
>=
实际上可能比使用
do
符号更干净、更简单。

当然,它会抓住foo2的情况。用莱顿的话来形容你的食物:

let a = sepBy word (char '.')
parseTest a "foo.bar.baz"
parseTest a "foo"
parseTest a ".baz"

首先,您需要
endBy
而不是
sebby

do k <- endBy foo1 (char'.')
   j <- foo2

dok您想要的是
endBy
,而不是
sebby

foo = do k <- foo1 `endBy` char '.'
         j <- foo2
         ... 
或者,不带
控件。应用程序

foo = do k <- many $ do x <- foo1; char '.'; return x
         j <- foo2
         ...
foo=dok
foo = do k <- many $ do x <- foo1; char '.'; return x
         j <- foo2
         ...