module Parser where
import Control.Applicative hiding (many,(<|>))
import Control.Exception
import qualified Data.ByteString.Lazy.Char8 as BL
import System.IO
import Text.Parsec
import Text.Parsec.ByteString.Lazy
spcs :: Parser ()
spcs = () <$ many spc
spcs1 :: Parser ()
spcs1 = () <$ many1 spc
spc :: Parser Char
spc = satisfy (`elem` " \t")
commentLines :: Parser ()
commentLines = () <$ many commentLine
where
commentLine = trailing
trailing :: Parser ()
trailing = () <$ (comment *> newline <|> newline)
comment :: Parser ()
comment = () <$ char '#' <* many (noneOf "\n")
parseFile :: Parser a -> FilePath -> IO a
parseFile p file = do
hdl <- openFile file ReadMode
hSetEncoding hdl latin1
bs <- BL.hGetContents hdl
case parse p "parseFile" bs of
Right x -> return x
Left e -> throwIO . userError . show $ e