module ParseLib.Abstract.Core
(
Parser(),
anySymbol,
satisfy,
empty, failp,
succeed, pure,
(<|>),
(<<|>),
(<*>),
(<$>),
(>>=),
look,
parse
)
where
import Data.Char
import Data.Traversable
import Data.Maybe
import Control.Monad
import Control.Applicative
import qualified ParseLib.Simple.Core as SP
newtype Parser s r = Parser { runParser :: [s] -> [(r,[s])] }
instance Functor (Parser s) where
fmap f p = Parser (f SP.<$> runParser p)
instance Applicative (Parser s) where
pure x = Parser (SP.succeed x)
p <*> q = Parser (runParser p SP.<*> runParser q)
instance Alternative (Parser s) where
empty = Parser SP.empty
p <|> q = Parser (runParser p SP.<|> runParser q)
infixr 3 <<|>
(<<|>) :: Parser s a -> Parser s a -> Parser s a
p <<|> q = Parser (runParser p SP.<<|> runParser q)
instance Monad (Parser s) where
return = pure
p >>= f = Parser (runParser p SP.>>= (runParser . f))
instance MonadPlus (Parser s) where
mzero = empty
mplus = (<|>)
anySymbol :: Parser s s
anySymbol = Parser (SP.anySymbol)
satisfy :: (s -> Bool) -> Parser s s
satisfy p = Parser (SP.satisfy p)
succeed :: a -> Parser s a
succeed = pure
failp :: Parser s a
failp = empty
look :: Parser s [s]
look = Parser (\ xs -> [(xs, xs)])
parse :: Parser s a -> [s] -> [(a,[s])]
parse = runParser