on d87affe help sign in
elk/src/Parse/Pattern.hs
63 lines 1.9 kB history raw
1module Parse.Pattern (term, expr) where
3import Control.Applicative ((<$>))
4import Data.Char (isUpper)
5import qualified Data.List as List
6import Text.Parsec ((<|>), (<?>), char, choice, optionMaybe, try)
8import Parse.Helpers
9import qualified Parse.Literal as Literal
10import qualified AST.Literal as L
11import qualified AST.Pattern as P
12import qualified AST.Variable as Var
14basic :: IParser P.RawPattern
15basic = choice
16 [ char '_' >> return P.Anything
17 , stringToPattern <$> var
18 , P.Literal <$> Literal.literal
19 ]
20 where
21 stringToPattern v =
22 case v of
23 "True" -> P.Literal (L.Boolean True)
24 "False" -> P.Literal (L.Boolean False)
25 c:_ | isUpper c -> P.Data (Var.Raw v) []
26 _ -> P.Var v
28asPattern :: P.RawPattern -> IParser P.RawPattern
29asPattern pattern = do
30 var <- optionMaybe (try (whitespace >> reserved "as" >> whitespace >> lowVar))
31 return $ case var of
32 Just v -> P.Alias v pattern
33 Nothing -> pattern
35record :: IParser P.RawPattern
36record = P.Record <$> brackets (commaSep1 lowVar)
38tuple :: IParser P.RawPattern
39tuple = do
40 ps <- parens (commaSep expr)
41 return $ case ps of
42 [p] -> p
43 _ -> P.tuple ps
45list :: IParser P.RawPattern
46list = P.list <$> braces (commaSep expr)
48term :: IParser P.RawPattern
49term =
50 (choice [ record, tuple, list, basic ]) <?> "pattern"
52patternConstructor :: IParser P.RawPattern
53patternConstructor = do
54 v <- List.intercalate "." <$> dotSep1 capVar
55 case v of
56 "True" -> return $ P.Literal (L.Boolean True)
57 "False" -> return $ P.Literal (L.Boolean False)
58 _ -> P.Data (Var.Raw v) <$> spacePrefix term
60expr :: IParser P.RawPattern
61expr = do
62 patterns <- consSep1 (patternConstructor <|> term)
63 asPattern (foldr1 P.cons patterns) <?> "pattern"