adp-multi-0.1.0: src/ADP/Multi/SimpleParsers.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-} -- needed for Parseable
{-# LANGUAGE DeriveDataTypeable #-}
module ADP.Multi.SimpleParsers where
import Data.Array
import Data.Typeable
import Data.Data
import ADP.Multi.Parser
data EPS = EPS deriving (Eq, Show, Data, Typeable)
-- # elementary parsers
empty1 :: RichParser a EPS
empty1 = (
ParserInfo1 {minYield=0, maxYield=Just 0},
\ _ [i,j] ->
[ EPS |
i == j
]
)
empty2 :: RichParser a (EPS,EPS)
empty2 = (
ParserInfo2 {minYield2=(0,0), maxYield2=(Just 0,Just 0)},
\ _ [i,j,k,l] ->
[ (EPS,EPS) |
i == j && k == l
]
)
anychars :: RichParser a (a,a)
anychars = (
ParserInfo2 {minYield2=(1,1), maxYield2=(Just 1,Just 1)},
\ z [i,j,k,l] ->
[ (z!j, z!l) |
i+1 == j && k+1 == l
]
)
chars :: Eq a => a -> a -> RichParser a (a,a)
chars c1 c2 = (
ParserInfo2 {minYield2=(1,1), maxYield2=(Just 1,Just 1)},
\ z [i,j,k,l] ->
[ (z!j, z!l) |
i+1 == j && k+1 == l && z!j == c1 && z!l == c2
]
)
char :: Eq a => a -> RichParser a a
char c = (
ParserInfo1 {minYield=1, maxYield=Just 1},
\ z [i,j] ->
[ (z!j) |
i+1 == j && z!j == c
]
)
anychar :: RichParser a a
anychar = (
ParserInfo1 {minYield=1, maxYield=Just 1},
\ z [i,j] ->
[ (z!j) |
i+1 == j
]
)
charLeftOnly :: Eq a => a -> RichParser a (a,EPS)
charLeftOnly c = (
ParserInfo2 {minYield2=(1,0), maxYield2=(Just 1,Just 0)},
\ z [i,j,k,l] ->
[ (c, EPS) |
i+1 == j && k == l && z!j == c
]
)
charRightOnly :: Eq a => a -> RichParser a (EPS,a)
charRightOnly c = (
ParserInfo2 {minYield2=(0,1), maxYield2=(Just 0,Just 1)},
\ z [i,j,k,l] ->
[ (EPS, c) |
i == j && k+1 == l && z!l == c
]
)
-- # some syntax sugar
instance Parseable EPS Char EPS where
toParser _ = empty1
instance Parseable Char Char Char where
toParser = char
instance Parseable (EPS,EPS) Char (EPS,EPS) where
toParser _ = empty2
instance Parseable (Char,Char) Char (Char,Char) where
toParser (c1,c2) = chars c1 c2
instance Parseable (EPS,Char) Char (EPS,Char) where
toParser (_,c) = charRightOnly c
instance Parseable (Char,EPS) Char (Char,EPS) where
toParser (c,_) = charLeftOnly c