Guest User

Untitled

a guest
May 21st, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. {-# OPTIONS_GHC -Wall #-}
  2. import Control.Applicative
  3. import Data.Char
  4.  
  5. newtype Parser a = P (String -> [(a, String)])
  6.  
  7. parse :: Parser a -> String -> [(a, String)]
  8. parse (P p) inp = p inp
  9.  
  10. instance Functor Parser where
  11. fmap g p = P (\inp -> case parse p inp of
  12. [] -> []
  13. [(v, out)] -> [(g v, out)]
  14. _ -> undefined)
  15.  
  16. instance Applicative Parser where
  17. pure v = P (\inp -> [(v, inp)])
  18. pg <*> px = P (\inp -> case parse pg inp of
  19. [] -> []
  20. [(g, out)] -> parse (fmap g px) out
  21. _ -> undefined)
  22.  
  23. instance Monad Parser where
  24. p >>= f = P (\inp -> case parse p inp of
  25. [] -> []
  26. [(v, out)] -> parse (f v) out
  27. _ -> undefined)
  28.  
  29. instance Alternative Parser where
  30. empty = P (\_ -> [])
  31. p <|> q = P (\inp -> case parse p inp of
  32. [] -> parse q inp
  33. [(v, out)] -> [(v, out)]
  34. _ -> undefined)
  35. many x = some x <|> pure []
  36. some x = pure (:) <*> x <*> many x
  37.  
  38. item :: Parser Char
  39. item = P (\inp -> case inp of
  40. [] -> []
  41. (x : xs) -> [(x, xs)])
  42.  
  43. sat :: (Char -> Bool) -> Parser Char
  44. sat p = do x <- item
  45. if p x
  46. then return x
  47. else empty
  48.  
  49. digit :: Parser Char
  50. digit = sat isDigit
  51.  
  52. char :: Char -> Parser Char
  53. char x = sat (== x)
  54.  
  55. string :: String -> Parser String
  56. string [] = return []
  57. string (x : xs) = do _ <- char x
  58. _ <- string xs
  59. return (x : xs)
  60.  
  61. space :: Parser ()
  62. space = do _ <- many (sat isSpace)
  63. return ()
  64.  
  65. nat :: Parser Int
  66. nat = do xs <- some digit
  67. return (read xs)
  68.  
  69. int :: Parser Int
  70. int = do _ <- char '-'
  71. n <- nat
  72. return (-n)
  73. <|> nat
  74.  
  75. token :: Parser a -> Parser a
  76. token p = do _ <- space
  77. v <- p
  78. _ <- space
  79. return v
  80.  
  81. integer :: Parser Int
  82. integer = token int
  83.  
  84. symbol :: String -> Parser String
  85. symbol = token . string
  86.  
  87. expr :: Parser Int
  88. expr = do t <- term
  89. do _ <- symbol "+"
  90. e <- expr
  91. return (t + e)
  92. <|> do _ <- symbol "-"
  93. e <- expr
  94. return (t - e)
  95. <|> return t
  96.  
  97. term :: Parser Int
  98. term = do ep <- expo
  99. do _ <- symbol "*"
  100. t <- term
  101. return (ep * t)
  102. <|> do _ <- symbol "/"
  103. t <- term
  104. return (ep `div` t)
  105. <|> return ep
  106.  
  107. expo :: Parser Int
  108. expo = do f <- factor
  109. do _ <- symbol "^"
  110. e <- expo
  111. return (f ^ e)
  112. <|> return f
  113.  
  114. factor :: Parser Int
  115. factor = do _ <- symbol "("
  116. e <- expr
  117. _ <- symbol ")"
  118. return e
  119. <|> integer
  120.  
  121. eval :: String -> Int
  122. eval xs = case (parse expr xs) of
  123. [(n, [])] -> n
  124. [(_, out)] -> error ("Unused input " ++ out)
  125. [] -> error "Invalid input"
  126. _ -> undefined
Add Comment
Please, Sign In to add comment