@@ -1,18 +1,19 @@
11module Parse.Expression (def,term,typeAnnotation,expr) where
22
33import Control.Applicative ((<$>), (<*>))
4−import Data.List (foldl')
5−import Text.Parsec hiding (newline,spaces)
6−import Text.Parsec.Indent
7−
8−import Parse.Binop
9−import Parse.Helpers as Help
10−import Parse.Literal
4+import qualified Data.List as List
5+import Text.Parsec hiding (newline, spaces)
6+import Text.Parsec.Indent (block, withPos)
7+
8+import qualified Parse.Binop as Binop
9+import Parse.Helpers
10+import qualified Parse.Helpers as Help
11+import qualified Parse.Literal as Literal
1112import qualified Parse.Pattern as Pattern
1213import qualified Parse.Type as Type
1314
14−import AST.Annotation as Annotation
15−import AST.Expression.General
15+import qualified AST.Annotation as Annotation
16+import qualified AST.Expression.General as E
1617import qualified AST.Expression.Source as Source
1718import qualified AST.Literal as L
1819import qualified AST.Pattern as P
@@ -25,45 +26,47 @@ varTerm :: IParser Source.Expr'
2526varTerm = toVar <$> var <?> "variable"
2627
2728toVar :: String -> Source.Expr'
28−toVar v = case v of "True" -> Literal (L.Boolean True)
29− "False" -> Literal (L.Boolean False)
30− _ -> rawVar v
29+toVar v =
30+ case v of
31+ "True" -> E.Literal (L.Boolean True)
32+ "False" -> E.Literal (L.Boolean False)
33+ _ -> E.rawVar v
3134
3235accessor :: IParser Source.Expr'
3336accessor = do
3437 (start, lbl, end) <- located (try (string "." >> rLabel))
3538 let loc e = Annotation.at start end e
36− return (Lambda (P.Var "_") (loc $ Access (loc $ rawVar "_") lbl))
39+ return (E.Lambda (P.Var "_") (loc $ E.Access (loc $ E.rawVar "_") lbl))
3740
3841negative :: IParser Source.Expr'
3942negative = do
4043 (start, nTerm, end) <-
4144 located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
4245 let loc e = Annotation.at start end e
43− return (Binop (Var.Raw "-") (loc $ Literal (L.IntNum 0)) nTerm)
46+ return (E.Binop (Var.Raw "-") (loc $ E.Literal (L.IntNum 0)) nTerm)
4447
4548
4649-------- Complex Terms --------
4750
4851listTerm :: IParser Source.Expr'
49−listTerm = markdown' <|> shader' <|> braces (try range <|> ExplicitList <$> commaSep expr)
52+listTerm = markdown' <|> shader' <|> braces (try range <|> E.ExplicitList <$> commaSep expr)
5053 where
5154 range = do
5255 lo <- expr
5356 padded (string "..")
54− Range lo <$> expr
57+ E.Range lo <$> expr
5558
5659 markdown' = do
5760 pos <- getPosition
5861 let uid = show (sourceLine pos) ++ ":" ++ show (sourceColumn pos)
5962 (rawText, exprs) <- Help.markdown (interpolation uid)
60− return (Markdown uid (filter (/='\r') rawText) exprs)
63+ return (E.Markdown uid (filter (/='\r') rawText) exprs)
6164
6265 shader' = do
6366 pos <- getPosition
6467 let uid = show (sourceLine pos) ++ ":" ++ show (sourceColumn pos)
6568 (rawSrc, tipe) <- Help.shader
66− return $ GLShader uid (filter (/='\r') rawSrc) tipe
69+ return $ E.GLShader uid (filter (/='\r') rawSrc) tipe
6770
6871 span uid index =
6972 "<span id=\"md-" ++ uid ++ "-" ++ show index ++
@@ -81,22 +84,22 @@ parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
8184 opFn = do
8285 (start, op, end) <- located anyOp
8386 let loc = Annotation.at start end
84− return . loc . Lambda (P.Var "x") . loc . Lambda (P.Var "y") . loc $
85− Binop (Var.Raw op) (loc (rawVar "x")) (loc (rawVar "y"))
87+ return . loc . E.Lambda (P.Var "x") . loc . E.Lambda (P.Var "y") . loc $
88+ E.Binop (Var.Raw op) (loc (E.rawVar "x")) (loc (E.rawVar "y"))
8689
8790 tupleFn = do
8891 let comma = char ',' <?> "comma ','"
8992 (start, commas, end) <- located (comma >> many (whitespace >> comma))
9093 let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
9194 loc = Annotation.at start end
92− return $ foldr (\x e -> loc $ Lambda x e)
93− (loc . tuple $ map (loc . rawVar) vars) (map P.Var vars)
95+ return $ foldr (\x e -> loc $ E.Lambda x e)
96+ (loc . E.tuple $ map (loc . E.rawVar) vars) (map P.Var vars)
9497
9598 parened = do
9699 (start, es, end) <- located (commaSep expr)
97100 return $ case es of
98101 [e] -> e
99− _ -> Annotation.at start end (tuple es)
102+ _ -> Annotation.at start end (E.tuple es)
100103
101104recordTerm :: IParser Source.Expr
102105recordTerm = brackets $ choice [ misc, addLocation record ]
@@ -108,24 +111,24 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
108111 body <- expr
109112 return (label, makeFunction patterns body)
110113
111− record = Record <$> commaSep field
114+ record = E.Record <$> commaSep field
112115
113116 change = do
114117 lbl <- rLabel
115118 padded (string "<-")
116119 (,) lbl <$> expr
117120
118− remove r = addLocation (string "-" >> whitespace >> Remove r <$> rLabel)
121+ remove r = addLocation (string "-" >> whitespace >> E.Remove r <$> rLabel)
119122
120123 insert r = addLocation $ do
121124 string "|" >> whitespace
122− Insert r <$> rLabel <*> (padded equals >> expr)
125+ E.Insert r <$> rLabel <*> (padded equals >> expr)
123126
124127 modify r =
125− addLocation (string "|" >> whitespace >> Modify r <$> commaSep1 change)
128+ addLocation (string "|" >> whitespace >> E.Modify r <$> commaSep1 change)
126129
127130 misc = try $ do
128− record <- addLocation (rawVar <$> rLabel)
131+ record <- addLocation (E.rawVar <$> rLabel)
129132 opt <- padded (optionMaybe (remove record))
130133 case opt of
131134 Just e -> try (insert e) <|> return e
@@ -133,7 +136,7 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
133136
134137
135138term :: IParser Source.Expr
136−term = addLocation (choice [ Literal <$> literal, listTerm, accessor, negative ])
139+term = addLocation (choice [ E.Literal <$> Literal.literal, listTerm, accessor, negative ])
137140 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
138141 <?> "basic term (4, x, 'c', etc.)"
139142
@@ -146,12 +149,12 @@ appExpr = do
146149 if null str then notFollowedBy (char '-') else return ()
147150 return $ case ts of
148151 [] -> t
149− _ -> foldl' (\f x -> Annotation.merge f x $ App f x) t ts
152+ _ -> List.foldl' (\f x -> Annotation.merge f x $ E.App f x) t ts
150153
151154-------- Normal Expressions --------
152155
153156binaryExpr :: IParser Source.Expr
154−binaryExpr = binops appExpr lastExpr anyOp
157+binaryExpr = Binop.binops appExpr lastExpr anyOp
155158 where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
156159 <|> lambdaExpr
157160
@@ -164,9 +167,12 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
164167 thenBranch <- expr
165168 whitespace <?> "an 'else' branch" ; reserved "else" <?> "an 'else' branch" ; whitespace
166169 elseBranch <- expr
167− return $ MultiIf [(bool, thenBranch),
168− (Annotation.sameAs elseBranch (Literal . L.Boolean $ True), elseBranch)]
169− multiIf = MultiIf <$> spaceSep1 iff
170+ return $ E.MultiIf
171+ [ (bool, thenBranch)
172+ , (Annotation.sameAs elseBranch (E.Literal . L.Boolean $ True), elseBranch)
173+ ]
174+
175+ multiIf = E.MultiIf <$> spaceSep1 iff
170176 where iff = do string "|" ; whitespace
171177 b <- expr ; padded arrow
172178 (,) b <$> expr
@@ -187,12 +193,12 @@ letExpr = do
187193 reserved "let" ; whitespace
188194 defs <- defSet
189195 padded (reserved "in")
190− Let defs <$> expr
196+ E.Let defs <$> expr
191197
192198caseExpr :: IParser Source.Expr'
193199caseExpr = do
194200 reserved "case"; e <- padded expr; reserved "of"; whitespace
195− Case e <$> (with <|> without)
201+ E.Case e <$> (with <|> without)
196202 where case_ = do p <- Pattern.expr
197203 padded arrow
198204 (,) p <$> expr
@@ -226,8 +232,8 @@ defStart =
226232 else [ P.Var (o:p), p1, p2 ]
227233
228234makeFunction :: [P.RawPattern] -> Source.Expr -> Source.Expr
229−makeFunction args body@(A ann _) =
230− foldr (\arg body' -> A ann $ Lambda arg body') body args
235+makeFunction args body@(Annotation.A ann _) =
236+ foldr (\arg body' -> Annotation.A ann $ E.Lambda arg body') body args
231237
232238definition :: IParser Source.Def
233239definition = withPos $ do