2015-01-14 2 views
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 
+1

Похоже, что в последнем предложении отсутствует слово или два. Что именно вы кормите, чего вы ожидаете и что получаете? Можете ли вы минимизировать фрагмент кода? – Yuras

ответ

2

Я нашел проблему: space включает в себя линейку кормов, '\n'.

Смежные вопросы