KiCS-debugger-0.1.0: biosphere/src/Curry/Debugger/Parser.hs
module Curry.Debugger.Parser where
-- This module should be deleted and referencing imports replaced by imports of the parser combinators included in the haskell library
infixl 4 <$>, <*, *>, <*>
infixl 3 <||>
type Parser a = String -> Pos -> Result a
data Result a = Result a String Pos
| Error String
deriving Show
type Pos = (Int,Int)
row :: Pos -> Int
row (_,x) = x
col :: Pos -> Int
col (x,_) = x
incPos :: Char -> Pos -> Pos
incPos '\n' (_,y) = (0,y+1)
incPos _ (x,y) = (x+1,y)
showPos :: Pos -> String
showPos (x,y) = "at line " ++ show x ++ " at column " ++ show y
pSucceed :: a -> Parser a
pSucceed = Result
pFail :: Parser a
pFail _ pos = Error ("Fail " ++ showPos pos)
pSym :: Char -> Parser Char
pSym c = pPred (c==)
pPred :: (Char -> Bool) -> Parser Char
pPred p [] _ = Error "End of File"
pPred p (t:ts) pos | p t = Result t ts (incPos t pos)
| otherwise = err
where
err = Error ("unexpected Symbol " ++ show t ++ " " ++ showPos pos)
(<||>) :: Parser a -> Parser a -> Parser a
(p <||> q) input pos =
case p input pos of
Error _ -> q input pos
result -> result
(<*>) :: Parser (b -> a) -> Parser b -> Parser a
(p <*> q) input pos1 =
case p input pos1 of
Result pv qinput pos2 ->
case q qinput pos2 of
Result qv rest pos3 -> Result (pv qv) rest pos3
Error err -> Error err
Error err -> Error err
(<->>) :: Parser a -> (a -> Parser b) -> Parser b
(p <->> qf) ts pos1 =
case p ts pos1 of
Result pv ts1 pos2 ->
case qf pv ts1 pos2 of
Error err -> Error err
result -> result
Error err -> Error err
(<$>) :: (b -> a) -> Parser b -> Parser a
f <$> p = pSucceed f <*> p
f <$ p = const f <$> p
(<*) :: Parser a -> Parser b -> Parser a
p <* q = (\ x _ -> x) <$> p <*> q
(*>) :: Parser a -> Parser b -> Parser b
p *> q = (\ _ x -> x) <$> p <*> q