Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 22nd, 2012  |  syntax: None  |  size: 0.67 KB  |  hits: 21  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. import qualified Text.Parsec as P
  2. import Text.Parsec.String (Parser)
  3.  
  4. data S = SNum Int | SAtom String | SList [S] deriving Show
  5.  
  6. main :: IO ()
  7. main = do
  8.   P.parseTest s "123"
  9.   P.parseTest s "abc"
  10.   P.parseTest s "+"
  11.   P.parseTest s "()"
  12.   P.parseTest s "(abc 123)"
  13.   P.parseTest s "(abc (+ 2 3))"
  14.  
  15. s :: Parser S
  16. s = P.choice [parseNum, parseAtom, parseList]
  17.  
  18. parseNum :: Parser S
  19. parseNum = do
  20.   ds <- P.many1 P.digit
  21.   return $ SNum $ read ds
  22.  
  23. parseAtom :: Parser S
  24. parseAtom = do
  25.   x <- P.many1 (P.noneOf "() ")
  26.   return $ SAtom x
  27.  
  28. parseList :: Parser S
  29. parseList = do
  30.   P.char '('
  31.   xs <- P.many $ do
  32.     x <- s
  33.     P.skipMany P.space
  34.     return x
  35.   P.char ')'
  36.   return $ SList xs