cherry-lisp/src/Parser.hs

86 lines
2.1 KiB
Haskell
Raw Normal View History

2021-01-29 23:11:03 +00:00
module Parser where
2021-01-28 01:16:30 +00:00
import Text.Parsec
import Text.Parsec.String
2021-01-29 23:11:03 +00:00
import Lexer
2021-01-28 01:16:30 +00:00
import TokenType
import ExprType
parseExpression :: String -> Either ParseError Expr
parseExpression s = do
tokns <- parse parseTokens "lexical error" s
2021-01-29 00:16:15 +00:00
expr <- parse expressionFromTokensEOF "parsing error" tokns
return expr
expressionFromTokensEOF :: GenParser Token st Expr
expressionFromTokensEOF = do
expr <- expressionFromTokens
_ <- eof
2021-01-28 01:16:30 +00:00
return expr
2021-01-28 23:47:53 +00:00
expressionFromTokens :: GenParser Token st Expr
expressionFromTokens = do
expr <- intE <|> try defineE <|> try nilE <|> varE <|> procedureE
return expr
2021-01-28 01:16:30 +00:00
intE :: GenParser Token st Expr
intE = do
(IntT num) <- parseIntT
return $ IntE num
procedureE :: GenParser Token st Expr
procedureE = do
_ <- parseLeftParenT
(VarT p) <- parseVarT
2021-01-28 23:47:53 +00:00
args <- many expressionFromTokens
2021-01-28 01:16:30 +00:00
_ <- parseRightParenT
return $ ProcedureE p args
varE :: GenParser Token st Expr
varE = do
(VarT var) <- parseVarT
return $ VarE var
nilE :: GenParser Token st Expr
nilE = do
_ <- parseNilT
return NilE
defineE :: GenParser Token st Expr
defineE = do
_ <- parseLeftParenT
_ <- parseSetT
2021-01-28 01:16:30 +00:00
(VarT var) <- parseVarT
2021-01-28 23:47:53 +00:00
expr <- expressionFromTokens
2021-01-28 01:16:30 +00:00
_ <- parseRightParenT
return $ SetE var expr
2021-01-28 01:16:30 +00:00
------------------------------------------------------------
satisfyT :: (Stream s m a, Show a) => (a -> Bool) -> ParsecT s u m a
satisfyT f = tokenPrim show
(\pos _ _ -> incSourceColumn pos 1)
(\t -> if f t then Just t else Nothing)
parseLeftParenT :: GenParser Token st Token
parseLeftParenT = satisfyT (== LeftParenT)
parseRightParenT :: GenParser Token st Token
parseRightParenT = satisfyT (== RightParenT)
parseSetT :: GenParser Token st Token
parseSetT = satisfyT (== SetT)
2021-01-28 01:16:30 +00:00
parseNilT :: GenParser Token st Token
parseNilT = satisfyT (== NilT)
parseVarT :: GenParser Token st Token
parseVarT = satisfyT isVarT
where isVarT (VarT _) = True
isVarT _ = False
parseIntT :: GenParser Token st Token
parseIntT = satisfyT isIntT
where isIntT (IntT _) = True
isIntT _ = False