on 577fc17 help sign in
elk/compiler/Parse/Pattern.hs
62 lines 1.8 kB history raw
1{-# OPTIONS_GHC -W #-}
2module Parse.Pattern (term, expr) where
4import Control.Applicative ((<$>))
5import Data.Char (isUpper)
6import qualified Data.List as List
7import Text.Parsec hiding (newline,spaces,State)
9import Parse.Helpers
10import Parse.Literal
11import AST.Literal
12import qualified AST.Pattern as P
13import qualified AST.Variable as Var
15basic :: IParser P.RawPattern
16basic = choice
17 [ char '_' >> return P.Anything
18 , do v <- var
19 return $ case v of
20 "True" -> P.Literal (Boolean True)
21 "False" -> P.Literal (Boolean False)
22 c:_ | isUpper c -> P.Data (Var.Raw v) []
23 _ -> P.Var v
24 , P.Literal <$> literal
25 ]
27asPattern :: P.RawPattern -> IParser P.RawPattern
28asPattern pattern = do
29 var <- optionMaybe (try (whitespace >> reserved "as" >> whitespace >> lowVar))
30 return $ case var of
31 Just v -> P.Alias v pattern
32 Nothing -> pattern
34record :: IParser P.RawPattern
35record = P.Record <$> brackets (commaSep1 lowVar)
37tuple :: IParser P.RawPattern
38tuple = do
39 ps <- parens (commaSep expr)
40 return $ case ps of
41 [p] -> p
42 _ -> P.tuple ps
44list :: IParser P.RawPattern
45list = P.list <$> braces (commaSep expr)
47term :: IParser P.RawPattern
48term =
49 (choice [ record, tuple, list, basic ]) <?> "pattern"
51patternConstructor :: IParser P.RawPattern
52patternConstructor = do
53 v <- List.intercalate "." <$> dotSep1 capVar
54 case v of
55 "True" -> return $ P.Literal (Boolean True)
56 "False" -> return $ P.Literal (Boolean False)
57 _ -> P.Data (Var.Raw v) <$> spacePrefix term
59expr :: IParser P.RawPattern
60expr = do
61 patterns <- consSep1 (patternConstructor <|> term)
62 asPattern (foldr1 P.cons patterns) <?> "pattern"