@@ -1,18 +1,19 @@
1module Parse.Expression (def,term,typeAnnotation,expr) where
1module Parse.Expression (def,term,typeAnnotation,expr) where
3import Control.Applicative ((<$>), (<*>))
3import Control.Applicative ((<$>), (<*>))
4−import Data.List (foldl')
4+import qualified Data.List as List
5−import Text.Parsec hiding (newline,spaces)
5+import Text.Parsec hiding (newline, spaces)
6−import Text.Parsec.Indent
6+import Text.Parsec.Indent (block, withPos)
8−import Parse.Binop
8+import qualified Parse.Binop as Binop
9−import Parse.Helpers as Help
10+import qualified Parse.Helpers as Help
10−import Parse.Literal
11+import qualified Parse.Literal as Literal
11import qualified Parse.Pattern as Pattern
12import qualified Parse.Pattern as Pattern
12import qualified Parse.Type as Type
13import qualified Parse.Type as Type
14−import AST.Annotation as Annotation
15+import qualified AST.Annotation as Annotation
15−import AST.Expression.General
16+import qualified AST.Expression.General as E
16import qualified AST.Expression.Source as Source
17import qualified AST.Expression.Source as Source
17import qualified AST.Literal as L
18import qualified AST.Literal as L
18import qualified AST.Pattern as P
19import qualified AST.Pattern as P
@@ -25,45 +26,47 @@ varTerm :: IParser Source.Expr'
25varTerm = toVar <$> var <?> "variable"
26varTerm = toVar <$> var <?> "variable"
27toVar :: String -> Source.Expr'
28toVar :: String -> Source.Expr'
28−toVar v = case v of "True" -> Literal (L.Boolean True)
31+ "True" -> E.Literal (L.Boolean True)
29− "False" -> Literal (L.Boolean False)
32+ "False" -> E.Literal (L.Boolean False)
30− _ -> rawVar v
33+ _ -> E.rawVar v
32accessor :: IParser Source.Expr'
35accessor :: IParser Source.Expr'
33accessor = do
36accessor = do
34 (start, lbl, end) <- located (try (string "." >> rLabel))
37 (start, lbl, end) <- located (try (string "." >> rLabel))
35 let loc e = Annotation.at start end e
38 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))
38negative :: IParser Source.Expr'
41negative :: IParser Source.Expr'
39negative = do
42negative = do
40 (start, nTerm, end) <-
43 (start, nTerm, end) <-
41 located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
44 located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
42 let loc e = Annotation.at start end e
45 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)
46-------- Complex Terms --------
49-------- Complex Terms --------
48listTerm :: IParser Source.Expr'
51listTerm :: IParser Source.Expr'
49−listTerm = markdown' <|> shader' <|> braces (try range <|> ExplicitList <$> commaSep expr)
52+listTerm = markdown' <|> shader' <|> braces (try range <|> E.ExplicitList <$> commaSep expr)
51 range = do
54 range = do
52 lo <- expr
55 lo <- expr
53 padded (string "..")
56 padded (string "..")
54− Range lo <$> expr
57+ E.Range lo <$> expr
56 markdown' = do
59 markdown' = do
57 pos <- getPosition
60 pos <- getPosition
58 let uid = show (sourceLine pos) ++ ":" ++ show (sourceColumn pos)
61 let uid = show (sourceLine pos) ++ ":" ++ show (sourceColumn pos)
59 (rawText, exprs) <- Help.markdown (interpolation uid)
62 (rawText, exprs) <- Help.markdown (interpolation uid)
60− return (Markdown uid (filter (/='\r') rawText) exprs)
63+ return (E.Markdown uid (filter (/='\r') rawText) exprs)
62 shader' = do
65 shader' = do
63 pos <- getPosition
66 pos <- getPosition
64 let uid = show (sourceLine pos) ++ ":" ++ show (sourceColumn pos)
67 let uid = show (sourceLine pos) ++ ":" ++ show (sourceColumn pos)
65 (rawSrc, tipe) <- Help.shader
68 (rawSrc, tipe) <- Help.shader
66− return $ GLShader uid (filter (/='\r') rawSrc) tipe
69+ return $ E.GLShader uid (filter (/='\r') rawSrc) tipe
68 span uid index =
71 span uid index =
69 "<span id=\"md-" ++ uid ++ "-" ++ show index ++
72 "<span id=\"md-" ++ uid ++ "-" ++ show index ++
@@ -81,22 +84,22 @@ parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
82 (start, op, end) <- located anyOp
85 (start, op, end) <- located anyOp
83 let loc = Annotation.at start end
86 let loc = Annotation.at start end
84− return . loc . Lambda (P.Var "x") . loc . Lambda (P.Var "y") . loc $
87+ return . loc . E.Lambda (P.Var "x") . loc . E.Lambda (P.Var "y") . loc $
85− Binop (Var.Raw op) (loc (rawVar "x")) (loc (rawVar "y"))
88+ E.Binop (Var.Raw op) (loc (E.rawVar "x")) (loc (E.rawVar "y"))
87 tupleFn = do
90 tupleFn = do
88 let comma = char ',' <?> "comma ','"
91 let comma = char ',' <?> "comma ','"
89 (start, commas, end) <- located (comma >> many (whitespace >> comma))
92 (start, commas, end) <- located (comma >> many (whitespace >> comma))
90 let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
93 let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
91 loc = Annotation.at start end
94 loc = Annotation.at start end
92− return $ foldr (\x e -> loc $ Lambda x e)
95+ return $ foldr (\x e -> loc $ E.Lambda x e)
93− (loc . tuple $ map (loc . rawVar) vars) (map P.Var vars)
96+ (loc . E.tuple $ map (loc . E.rawVar) vars) (map P.Var vars)
95 parened = do
98 parened = do
96 (start, es, end) <- located (commaSep expr)
99 (start, es, end) <- located (commaSep expr)
97 return $ case es of
100 return $ case es of
99− _ -> Annotation.at start end (tuple es)
102+ _ -> Annotation.at start end (E.tuple es)
101recordTerm :: IParser Source.Expr
104recordTerm :: IParser Source.Expr
102recordTerm = brackets $ choice [ misc, addLocation record ]
105recordTerm = brackets $ choice [ misc, addLocation record ]
@@ -108,24 +111,24 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
108 body <- expr
111 body <- expr
109 return (label, makeFunction patterns body)
112 return (label, makeFunction patterns body)
111− record = Record <$> commaSep field
114+ record = E.Record <$> commaSep field
113 change = do
116 change = do
114 lbl <- rLabel
117 lbl <- rLabel
115 padded (string "<-")
118 padded (string "<-")
116 (,) lbl <$> expr
119 (,) lbl <$> expr
118− remove r = addLocation (string "-" >> whitespace >> Remove r <$> rLabel)
121+ remove r = addLocation (string "-" >> whitespace >> E.Remove r <$> rLabel)
120 insert r = addLocation $ do
123 insert r = addLocation $ do
121 string "|" >> whitespace
124 string "|" >> whitespace
122− Insert r <$> rLabel <*> (padded equals >> expr)
125+ E.Insert r <$> rLabel <*> (padded equals >> expr)
124 modify r =
127 modify r =
125− addLocation (string "|" >> whitespace >> Modify r <$> commaSep1 change)
128+ addLocation (string "|" >> whitespace >> E.Modify r <$> commaSep1 change)
127 misc = try $ do
130 misc = try $ do
128− record <- addLocation (rawVar <$> rLabel)
131+ record <- addLocation (E.rawVar <$> rLabel)
129 opt <- padded (optionMaybe (remove record))
132 opt <- padded (optionMaybe (remove record))
130 case opt of
133 case opt of
131 Just e -> try (insert e) <|> return e
134 Just e -> try (insert e) <|> return e
@@ -133,7 +136,7 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
135term :: IParser Source.Expr
138term :: IParser Source.Expr
136−term = addLocation (choice [ Literal <$> literal, listTerm, accessor, negative ])
139+term = addLocation (choice [ E.Literal <$> Literal.literal, listTerm, accessor, negative ])
137 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
140 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
138 <?> "basic term (4, x, 'c', etc.)"
141 <?> "basic term (4, x, 'c', etc.)"
@@ -146,12 +149,12 @@ appExpr = do
146 if null str then notFollowedBy (char '-') else return ()
149 if null str then notFollowedBy (char '-') else return ()
147 return $ case ts of
150 return $ case ts of
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
151-------- Normal Expressions --------
154-------- Normal Expressions --------
153binaryExpr :: IParser Source.Expr
156binaryExpr :: IParser Source.Expr
154−binaryExpr = binops appExpr lastExpr anyOp
157+binaryExpr = Binop.binops appExpr lastExpr anyOp
155 where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
158 where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
156 <|> lambdaExpr
159 <|> lambdaExpr
@@ -164,9 +167,12 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
164 thenBranch <- expr
167 thenBranch <- expr
165 whitespace <?> "an 'else' branch" ; reserved "else" <?> "an 'else' branch" ; whitespace
168 whitespace <?> "an 'else' branch" ; reserved "else" <?> "an 'else' branch" ; whitespace
166 elseBranch <- expr
169 elseBranch <- expr
167− return $ MultiIf [(bool, thenBranch),
171+ [ (bool, thenBranch)
168− (Annotation.sameAs elseBranch (Literal . L.Boolean $ True), elseBranch)]
172+ , (Annotation.sameAs elseBranch (E.Literal . L.Boolean $ True), elseBranch)
169− multiIf = MultiIf <$> spaceSep1 iff
175+ multiIf = E.MultiIf <$> spaceSep1 iff
170 where iff = do string "|" ; whitespace
176 where iff = do string "|" ; whitespace
171 b <- expr ; padded arrow
177 b <- expr ; padded arrow
172 (,) b <$> expr
178 (,) b <$> expr
@@ -187,12 +193,12 @@ letExpr = do
187 reserved "let" ; whitespace
193 reserved "let" ; whitespace
188 defs <- defSet
194 defs <- defSet
189 padded (reserved "in")
195 padded (reserved "in")
190− Let defs <$> expr
196+ E.Let defs <$> expr
192caseExpr :: IParser Source.Expr'
198caseExpr :: IParser Source.Expr'
193caseExpr = do
199caseExpr = do
194 reserved "case"; e <- padded expr; reserved "of"; whitespace
200 reserved "case"; e <- padded expr; reserved "of"; whitespace
195− Case e <$> (with <|> without)
201+ E.Case e <$> (with <|> without)
196 where case_ = do p <- Pattern.expr
202 where case_ = do p <- Pattern.expr
197 padded arrow
203 padded arrow
198 (,) p <$> expr
204 (,) p <$> expr
@@ -226,8 +232,8 @@ defStart =
226 else [ P.Var (o:p), p1, p2 ]
232 else [ P.Var (o:p), p1, p2 ]
228makeFunction :: [P.RawPattern] -> Source.Expr -> Source.Expr
234makeFunction :: [P.RawPattern] -> Source.Expr -> Source.Expr
229−makeFunction args body@(A ann _) =
235+makeFunction args body@(Annotation.A ann _) =
230− foldr (\arg body' -> A ann $ Lambda arg body') body args
236+ foldr (\arg body' -> Annotation.A ann $ E.Lambda arg body') body args
232definition :: IParser Source.Def
238definition :: IParser Source.Def
233definition = withPos $ do
239definition = withPos $ do