{-# OPTIONS_GHC -W #-} module Parse.Literal (literal) where import Control.Applicative ((<$>)) import Text.Parsec hiding (newline,spaces) import Parse.Helpers import AST.Literal literal :: IParser Literal literal = num <|> (Str <$> str) <|> (Chr <$> chr) "literal" num :: IParser Literal num = toLit <$> (number "number") where toLit n | any (`elem` ".eE") n = FloatNum (read n) | otherwise = IntNum (read n) number = concat <$> sequence [ option "" minus , many1 digit , option "" decimals , option "" exponent ] minus = try $ do string "-" lookAhead digit return "-" decimals = do try $ lookAhead (string "." >> digit) string "." n <- many1 digit return ('.' : n) exponent = do string "e" <|> string "E" op <- option "" (string "+" <|> string "-") n <- many1 digit return ('e' : op ++ n)