cherry-lisp/src/TokenParser.hs

39 lines
1004 B
Haskell

module TokenParser where
import Text.ParserCombinators.Parsec
import ParserUtils
import Data.Char
import TokenType
parseTokens :: GenParser Char st [Token]
parseTokens = do
_ <- spaces
many $ (spaces >> anyLispToken)
anyLispToken :: GenParser Char st Token
anyLispToken = leftParenT <|> rightParenT <|> try nilT <|> try defineT <|> varT <|> intT
------------------------------------------------------------
intT :: GenParser Char st Token
intT = do
number <- read <$> many1 digit
return $ IntT number
leftParenT :: GenParser Char st Token
leftParenT = char '(' >> return LeftParenT
rightParenT :: GenParser Char st Token
rightParenT = char ')' >> return RightParenT
defineT :: GenParser Char st Token
defineT = caseInsensitiveString "define" >> return DefineT
nilT :: GenParser Char st Token
nilT = caseInsensitiveString "nil" >> return NilT
varT :: GenParser Char st Token
varT = do
var <- map toLower <$> many1 (letter <|> oneOf "+-*/!|@#$~%&/=<>")
return $ VarT var