Parsing multiple lines into a list of lists in Haskell

Viewed 486

I am trying to parse a file that looks like:

a b c 
f e d

I want to match each of the symbols in the line and parse everything into a list of lists such as:

[[A, B, C], [D, E, F]]

In order to do that I tried the following:

import           Control.Monad
import           Text.ParserCombinators.Parsec
import           Text.ParserCombinators.Parsec.Language
import qualified Text.ParserCombinators.Parsec.Token    as P

parserP :: Parser [[MyType]]
parserP = do
  x  <- rowP
  xs <- many (newline >> rowP)
  return (x : xs)

rowP :: Parser [MyType]
rowP = manyTill cellP $ void newline <|> eof

cellP :: Parser (Cell Color)
cellP = aP <|> bP <|> ... -- rest of the parsers, they all look very similar

aP :: Parser MyType
aP = symbol "a" >> return A

bP :: Parser MyType
bP = symbol "b" >> return B

lexer = P.makeTokenParser emptyDef
symbol  = P.symbol lexer

But it fails to return multiple inner lists. Instead what I get is:

[[A, B, C, D, E, F]]

What am I doing wrong? I was expecting manyTill to parse cellP until the newline character, but that's not the case.

2 Answers
Related