1
------------------------------------------------------------------------
2
------------------------------------------------------------------------
5
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
10
import qualified Data.Map as Map
12
import qualified Parser
13
import Control.Applicative
17
data Parser k r' tok r = ![ r ] :&: !(Map tok (Parser k r' tok r))
19
instance Ord tok => Functor (Parser k r' tok) where
23
instance Ord tok => Alternative (Parser k r' tok) where
24
empty = [] :&: Map.empty
25
xs1 :&: f1 <|> xs2 :&: f2 =
26
xs1 ++ xs2 :&: Map.unionWith (<|>) f1 f2
29
instance Ord tok => Monad (Parser k r' tok) where
30
return x = [x] :&: Map.empty
31
xs :&: f >>= g = foldr (<|>) ([] :&: Map.map (>>= g) f) (map g xs)
33
instance Ord tok => Applicative (Parser k r' tok) where
35
p1 <*> p2 = p1 >>= \f -> p2 >>= \x -> return (f x)
38
parse :: Ord tok => Parser k r' tok r -> [ tok ] -> [ r ]
39
parse (xs :&: f) [] = xs
40
parse (xs :&: f) (c : s) = case Map.lookup c f of
44
instance Ord tok => Parser.Parser (Parser k r' tok) k r' tok where
45
sym c = [] :&: Map.singleton c (return c)