67 lines
1.5 KiB
Haskell
67 lines
1.5 KiB
Haskell
-- File: StringParse.hs
|
|
-- Date: Oct 26, 2011
|
|
-- Author: Collin J. Doering <rekahsoft@gmail.com>
|
|
-- Description: This is a test file in haskell implementing a simple base monadic parser
|
|
|
|
import Monad
|
|
|
|
-- parser as layed out by Programming in Haskell
|
|
newtype Parser a = Parser (String -> [(a, String)])
|
|
|
|
-- Parser as layed out by RealWorldHaskell
|
|
-- import qualified Data.ByteString.Lazy as L
|
|
-- data ParseState = ParseState {
|
|
-- string :: String
|
|
-- offset :: Integer
|
|
-- }
|
|
|
|
-- newtype Parser a = Parser {
|
|
-- runParse :: ParseState -> Either String (a, ParseState)
|
|
-- }
|
|
|
|
instance Monad Parser where
|
|
return v = Parser (\inp -> [(v,inp)])
|
|
p >>= q = Parser (\inp -> case parse p inp of
|
|
[] -> []
|
|
[(v,out)] -> parse (q v) out)
|
|
|
|
instance MonadPlus Parser where
|
|
mzero = Parser (\inp -> [])
|
|
mplus p q = Parser (\inp -> case parse p inp of
|
|
[] -> parse q inp
|
|
[(v,out)] -> [(v,out)])
|
|
|
|
failure :: Parser a
|
|
failure = Parser (\xs -> [])
|
|
|
|
item :: Parser Char
|
|
item = Parser (\inp -> case inp of
|
|
[] -> []
|
|
(x:xs) -> [(x,xs)])
|
|
|
|
parseWhile :: (a -> Bool) -> Parser a -> Parser a
|
|
parseWhile f (Parser p) = Parser $ \inp -> do
|
|
x <- item
|
|
if f x then parse p else failure
|
|
|
|
identity :: Parser Char
|
|
identity = Parser $ \inp -> []
|
|
|
|
parse :: Parser a -> String -> [(a,String)]
|
|
parse (Parser p) inp = p inp
|
|
|
|
p :: Parser (Char, Char)
|
|
p = do
|
|
x <- item
|
|
item
|
|
y <- item
|
|
return (x,y)
|
|
|
|
takeOneLeaveOne :: Parser Char
|
|
takeOneLeaveOne = do
|
|
x <- item
|
|
item
|
|
return x
|
|
|
|
--takeEveryOther :: Parser String
|
|
|