on 501c607 help sign in
elk/src/Parse/Pattern.hs
68 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
29asPattern :: P.RawPattern -> IParser P.RawPattern
30asPattern pattern =
31 do var <- optionMaybe (try (whitespace >> reserved "as") >> whitespace >> lowVar)
32 case var of
33 Just v ->
34 return (P.Alias v pattern)
36 Nothing ->
37 return pattern
40record :: IParser P.RawPattern
41record = P.Record <$> brackets (commaSep1 lowVar)
43tuple :: IParser P.RawPattern
44tuple = do
45 ps <- parens (commaSep expr)
46 return $ case ps of
47 [p] -> p
48 _ -> P.tuple ps
50list :: IParser P.RawPattern
51list = P.list <$> braces (commaSep expr)
53term :: IParser P.RawPattern
54term =
55 (choice [ record, tuple, list, basic ]) <?> "pattern"
57patternConstructor :: IParser P.RawPattern
58patternConstructor = do
59 v <- List.intercalate "." <$> dotSep1 capVar
60 case v of
61 "True" -> return $ P.Literal (L.Boolean True)
62 "False" -> return $ P.Literal (L.Boolean False)
63 _ -> P.Data (Var.Raw v) <$> spacePrefix term
65expr :: IParser P.RawPattern
66expr = do
67 patterns <- consSep1 (patternConstructor <|> term)
68 asPattern (foldr1 P.cons patterns) <?> "pattern"