packages feed

Elm-0.10.1: compiler/Parse/Literal.hs

module Parse.Literal (literal) where

import Control.Applicative ((<$>), (<*>))
import Control.Monad
import Text.Parsec hiding (newline,spaces)
import Text.Parsec.Indent

import Parse.Helpers
import SourceSyntax.Literal

literal = num <|> (Str <$> str) <|> (Chr <$> chr)

num :: IParser Literal
num = fmap toLit (preNum <?> "number")
    where toLit n | '.' `elem` n = FloatNum (read n)
                  | otherwise = IntNum (read n)
          preNum  = concat <$> sequence [ option "" minus, many1 digit, option "" postNum ]
          postNum = do try $ lookAhead (string "." >> digit)
                       string "."
                       ('.':) <$> many1 digit
          minus = try $ do string "-"
                           lookAhead digit
                           return "-"