module ParsePatterns (patternTerm, patternExpr) where import Ast import Combinators import Data.Char (isUpper) import ParserLib import Tokens import Control.Monad (liftM) patternBasic = (t UNDERSCORE >> return PAnything) +|+ (do { x@(c:_) <- var ; if isUpper c then PData x `liftM` star patternTerm else return $ PVar x }) patternTuple = do t LPAREN; ps <- sepBy1 (t COMMA) patternExpr; t RPAREN return $ case ps of { [p] -> p; _ -> ptuple ps } patternCons = do p <- patternTerm colon <- optional $ opParser (==":") case colon of Just ":" -> pcons p `liftM` patternExpr Nothing -> return p patternList = do t LBRACKET; ps <- sepBy (t COMMA) patternExpr; t RBRACKET; return (plist ps) patternTerm = patternTuple +|+ patternList +|+ patternBasic patternExpr = patternTuple +|+ patternList +|+ patternCons