Haskell 使用Parsec,我如何解析零个或多个以foo2结尾并以点分隔的foo1?
我试图做的事情似乎很简单,但由于我是一名parsec Haskell新手,解决方案就在我眼前 我有两个解析器,比如说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
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
...