
Untitled
By: a guest on
Jun 22nd, 2012 | syntax:
None | size: 0.67 KB | hits: 21 | expires: Never
import qualified Text.Parsec as P
import Text.Parsec.String (Parser)
data S = SNum Int | SAtom String | SList [S] deriving Show
main :: IO ()
main = do
P.parseTest s "123"
P.parseTest s "abc"
P.parseTest s "+"
P.parseTest s "()"
P.parseTest s "(abc 123)"
P.parseTest s "(abc (+ 2 3))"
s :: Parser S
s = P.choice [parseNum, parseAtom, parseList]
parseNum :: Parser S
parseNum = do
ds <- P.many1 P.digit
return $ SNum $ read ds
parseAtom :: Parser S
parseAtom = do
x <- P.many1 (P.noneOf "() ")
return $ SAtom x
parseList :: Parser S
parseList = do
P.char '('
xs <- P.many $ do
x <- s
P.skipMany P.space
return x
P.char ')'
return $ SList xs