packages feed

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