1
Я пытаюсь написать csv-подобный парсер, используя Parsec. Все идет нормально. Парсер декодирует заголовок и обрабатывает все нормально. Теперь я пытаюсь пропустить некоторые комментарии в начале файла. Комментарий начинается с #
(или пустой строки). Если я это сделаю, цикл endBy
не начинается, когда заголовок запускается, но вместо этого не выполняется.Как остановить endBy в Parsec
Вот мой код:
csvParser = do
-- skipping comment bit
P.endBy ((P.char '#' >> P.many (P.noneOf "\n"))
<|> P.many P.space
) eol
-- real parsing starting
header <- parseHeader
eol
case header of
["style", "number", "quantity", "length", "width", "height"] -> parsePL
otherwise -> error $ "Can't decore following header:" ++ (show header)
where parseHeader = P.sepBy cell sep
sep = P.char ','
eol = P.char '\n'
cell = P.many (P.noneOf ",\n")
cellp = do x <- cell ; sep; return x
today = "2015/01/15" :: Date
readR :: String -> Rational
readR x = toRational x' where
x' = read x :: Float
parsePL = P.endBy (do
style <- cellp
numberOfBox <- read <$> cellp
numberPerBox <- cellp
length <- readR <$> cellp
width <- readR <$> cellp
height <- readR <$> cell
return (style, numberOfBox, length, width, height, "", 0, "", today)
) eol
Похоже, что в последнем предложении отсутствует слово или два. Что именно вы кормите, чего вы ожидаете и что получаете? Можете ли вы минимизировать фрагмент кода? – Yuras