GaBuZoMeu/Parsers.hs

33 lines
976 B
Haskell

module Parsers where
import Text.ParserCombinators.Parsec
import Data.Maybe (catMaybes)
import Data.Char (toUpper)
import Control.Monad (liftM)
-- Parsing functions not in Text.ParserCombinators.Parsec
-- There is also a good ine in hsemail, manyNtoM
countBetween m n p
| n < m = error "First bound must be lower or equal than second bound"
| otherwise = do
xs <- try (count m p)
ys <- try (count (n - m) ((option Nothing) (do
y <- p
return (Just y))))
return (xs ++ catMaybes ys)
facultative p = liftM Just p <|> return Nothing
-- Case-insensitive parsers stloen from hsemail
-- Case-insensitive variant of Parsec's 'char' function.
ichar :: Char -> CharParser st Char
ichar c = satisfy (\x -> toUpper x == toUpper c)
-- Case-insensitive variant of Parsec's 'string' function.
istring :: String -> CharParser st String
istring cs = mapM ichar cs <?> cs
--
-- End of parsing functions