Haskell parsec解析一串项

Chr*_*ris 8 haskell parsec

我有一个列表,我需要解析除了最后一个元素之外的所有元素需要由一个解析器解析,最后一个元素需要由另一个解析器解析.

a = "p1 p1b ... p2"
or
a = "p2"
Run Code Online (Sandbox Code Playgroud)

本来我试过

parser = do parse1 <- many parser1
            parse2 <- parser2
            return AParse parse1 parse2
Run Code Online (Sandbox Code Playgroud)

问题是parse1可以使用parse2输入.所以parse1总是占用整个列表,并且没有任何东西留下parse2.

有没有办法说将parse1应用到除字符串中最后一个元素之外的所有内容,然后应用parse2?

luq*_*qui 2

怎么样:

parseTrain car caboose = choice
    [ fmap (:[]) $ try (caboose `endBy` eof), 
    , liftM2 (:) car (parseTrain car caboose) 
    [
Run Code Online (Sandbox Code Playgroud)

eof 让我烦恼,因为这使得这个解析器不具有组合性。即你不能说:

char '(' >> parseTrain p1 p2 >> char ')'
Run Code Online (Sandbox Code Playgroud)

对于解析器来说,以组合方式执行此操作非常困难。它如何知道继续前进到 char ')',而不尝试抓住每一个机会并查看是否失败?这样做可以使时间呈指数级增长。

如果您需要它是组合的,您的问题是否有一些可以利用的附加结构?例如,您可以解析所有元素的列表,然后在事后处理最后一个元素吗?