vintage-basic-1.0: src/Language/VintageBasic/RuntimeParser.hs
-- | Parsing for @DATA@ statements and the @INPUT@ buffer.
module Language.VintageBasic.RuntimeParser(dataValsP,readFloat,trim) where
import Language.VintageBasic.FloatParser(floatP)
import Text.ParserCombinators.Parsec
-- | Attempts to parse a floating point value from a string.
readFloat :: String -> Maybe Float
readFloat s =
case parse floatP "" s
of (Right fv) -> Just fv
_ -> Nothing
nonCommaP :: Parser Char
nonCommaP = satisfy (/=',')
stringP :: Parser String
stringP =
do char '"'
s <- manyTill anyChar (char '"')
spaces
return s
-- | Trim leading and trailing space from a string.
trim :: String -> String
trim s = dropWhile (==' ') $ reverse $ dropWhile (==' ') $ reverse s
-- | Parse a single data value.
dataValP :: Parser String
dataValP = do
spaces
stringP <|> do { s <- many nonCommaP; return (trim s) }
-- | Parse a list of data values.
-- Works for both @INPUT@ text and @DATA@ statements.
dataValsP :: Parser [String]
dataValsP = sepBy1 dataValP (char ',')