Advertisement
Guest User

Untitled

a guest
Oct 10th, 2015
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# NoImplicitPrelude #-}
  2.  
  3. module DataConstuctorParser where
  4.  
  5. import Prelude
  6. import Control.Monad
  7. import Control.Monad.State
  8. import Control.Applicative
  9. import Data.Char
  10. import Data.Functor
  11. import System.IO
  12. import Data.List
  13.  
  14. data DataConstructor = DataConstructor String [String] deriving Show
  15.  
  16. parseCapital = oneOf "ABCDEFGHIGKLMNOPQRSTUVWXYZ"
  17.  
  18. parseDownCharString = many $ oneOf "abcdefghijklmnopqrstuvwxyz"
  19.  
  20. parseConstructorName = do
  21.   x <- parseCapital
  22.   y <- parseDownCharString
  23.   z <- many $ lexem $ parseDownCharString
  24.   return $ DataConstructor (x:y) z
  25.  
  26. parseCons str = runStateT parseConstructorName str
  27.  
  28.  
  29. type Apar a = StateT String Maybe a
  30.  
  31. isempty s foo = if (s == []) then Nothing else foo
  32.  
  33. parseByPred foo = StateT $ \s -> isempty s $ if (foo $ head s)
  34.                                            then Just (head s, tail s)
  35.                                            else Nothing
  36. char c = parseByPred (== c)
  37.  
  38. spaces = many $ char ' '
  39.  
  40. oneOf str = parseByPred (`elem` str)
  41.  
  42. lexem p = do
  43.   x <- p
  44.   spaces
  45.   return x
  46.  
  47. between f p g = do
  48.   f
  49.   x <- p
  50.   g
  51.   return x
  52.  
  53. exactly 0 _ = return []
  54. exactly n p = (:) <$> p <*> exactly (n - 1) p
  55.  
  56. manySepBy p g = (:) <$> p <*> many (g >> p)
  57.  
  58. parseInt = (many $ lexem $ oneOf "0xABCDEF1234567890") >>= \x -> if x == [] then mzero else return (read x :: Int)
  59. -----------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement