Guest User

Untitled

a guest
May 3rd, 2013
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. type Parse a = String -> Maybe ( a, String )
  2.  
  3.  
  4. char :: Char -> Parse Char
  5. char c []     = Nothing
  6. char c (x:xs) = if c == x then return (c, xs) else Nothing
  7.  
  8. string :: String -> Parse String
  9. string ""     = \str -> return ("", str)
  10. string (c:cs) = (char c <.> string cs) <!> uncurry (:)
  11.  
  12. bit :: Parse Bit
  13. bit = (char 'O' <!> const O) <|> (char 'I' <!> const I)
  14.  
  15. leaf :: Parse (Tree Bit)
  16. leaf = string "Leaf " <.> bit <!> (Leaf . snd)
  17.  
  18. node :: Parse (Tree Bit)
  19. node =    (string "Node (" <.>> tree <>.> string ") " <!> Node)
  20.       <.>  bit <!> uncurry ($)
  21.       <>.> string " (" <.> tree <>.> string ")" <!> uncurry ($)
  22.  
  23. tree :: Parse (Tree Bit)
  24. tree = node <|> leaf
  25.  
  26. -- Entscheidung zwischen zwei Alternativen
  27. (<|>) :: Parse a -> Parse a -> Parse a
  28. pa <|> pb = \str -> let r1 = pa str
  29.                      in if isJust r1 then r1 else pb str
  30.  
  31. -- Sequenz von Parsern
  32. (<.>) :: Parse a -> Parse b -> Parse (a,b)
  33. pa <.> pb = \str -> do (x,xs) <- pa str
  34.                        (y,ys) <- pb xs
  35.                        return ((x,y),ys)
  36.  
  37. -- Sequenz von Parsern (erstes Ergebnis nehmen)
  38. (<>.>) :: Parse a -> Parse b -> Parse a
  39. pa <>.> pb = (pa <.> pb) <!> fst
  40.  
  41. -- Sequenz von Parsern (zweites Ergebnis nehmen)
  42. (<.>>) :: Parse a -> Parse b -> Parse b
  43. pa <.>> pb = (pa <.> pb) <!> snd
  44.  
  45. -- Cast-Operator
  46. (<!>) :: Parse a -> (a -> b) -> Parse b
  47. p <!> f = \str -> do (x,s) <- p str
  48.                      return (f x,s)
  49.  
  50. parse :: String -> Tree Bit
  51. parse = fst . fromJust . tree
Advertisement
Add Comment
Please, Sign In to add comment