@@ -2,7 +2,6 @@ module Parse.Expression (term, expr, def) where
22
33import qualified Data.List as List
44import Text.Parsec hiding (newline, spaces)
5−import qualified Text.Parsec.Indent as Indent
65
76import qualified Parse.Binop as Binop
87import Parse.Helpers
@@ -11,11 +10,9 @@ import qualified Parse.Literal as Literal
1110import qualified Parse.Pattern as Pattern
1211import qualified Parse.Type as Type
1312
14−import qualified AST.Expression.General as E
15−import qualified AST.Expression.Source as Source
13+import qualified AST.Expression.Source as Src
1614import qualified AST.Literal as L
1715import qualified AST.Pattern as P
18−import qualified AST.Variable as Var
1916import qualified Reporting.Annotation as A
2017
2118
@@ -23,25 +20,25 @@ import qualified Reporting.Annotation as A
2320-------- Basic Terms --------
2421
2522
26−varTerm :: IParser Source.Expr'
23+varTerm :: IParser Src.RawExpr'
2724varTerm =
2825 toVar <$> Help.var
2926
3027
31−toVar :: String -> Source.Expr'
28+toVar :: String -> Src.RawExpr'
3229toVar v =
3330 case v of
3431 "True" ->
35− E.Literal (L.Boolean True)
32+ Src.Literal (L.Boolean True)
3633
3734 "False" ->
38− E.Literal (L.Boolean False)
35+ Src.Literal (L.Boolean False)
3936
4037 _ ->
41− E.rawVar v
38+ Src.var v
4239
4340
44−accessor :: IParser Source.Expr'
41+accessor :: IParser Src.RawExpr'
4542accessor =
4643 do (start, lbl, end) <- located (try (string "." >> rLabel))
4744
@@ -49,60 +46,56 @@ accessor =
4946 A.at start end value
5047
5148 return $
52− E.Lambda
49+ Src.Lambda
5350 (ann (P.Var "_"))
54− (ann (E.Access (ann (E.rawVar "_")) lbl))
51+ (ann (Src.Access (ann (Src.var "_")) lbl))
5552
5653
57−negative :: IParser Source.Expr'
54+negative :: IParser Src.RawExpr'
5855negative =
59− do (start, nTerm, end) <-
60− located $ try $
61− do char '-'
62− notFollowedBy (char '.' <|> char '-')
63− term
56+ try $
57+ do (A.A region _) <- addLocation (char '-')
58+ notFollowedBy (char '.' <|> char '-')
59+ negativeTerm <- term
6460
65− let ann e =
66− A.at start end e
61+ let zero = A.A region (Src.Literal (L.IntNum 0))
62+ let minus = A.A region "-"
63+
64+ return $ Src.Binop [(zero, minus)] negativeTerm
6765
68− return $
69− E.Binop
70− (Var.Raw "-")
71− (ann (E.Literal (L.IntNum 0)))
72− nTerm
7366
7467
7568
7669-------- Complex Terms --------
7770
7871
79−listTerm :: IParser Source.Expr'
72+listTerm :: IParser Src.RawExpr'
8073listTerm =
8174 choice
8275 [ do pos <- getPosition
8376 let uid = show (sourceLine pos) ++ ":" ++ show (sourceColumn pos)
8477 (rawSrc, tipe) <- Literal.shader
85− return $ E.GLShader uid (filter (/='\r') rawSrc) tipe
86− , braces (E.ExplicitList <$> commaSep expr)
78+ return $ Src.GLShader uid (filter (/='\r') rawSrc) tipe
79+ , braces (Src.List <$> commaSep expr)
8780 ]
8881
8982
90−parensTerm :: IParser Source.Expr
83+parensTerm :: IParser Src.RawExpr
9184parensTerm =
9285 let
9386 mkFunc args realBody start end =
9487 foldr
95− (\arg body -> A.at start end (E.Lambda (A.at start end (P.Var arg)) body))
96− (A.at start end (realBody (A.at start end . E.rawVar)))
88+ (\arg body -> A.at start end (Src.Lambda (A.at start end (P.Var arg)) body))
89+ (A.at start end (realBody (A.at start end . Src.var)))
9790 args
9891
9992 mkBinop op =
100− mkFunc ["x","y"] (\var -> E.Binop (Var.Raw op) (var "x") (var "y"))
93+ mkFunc ["x","y"] $ \var -> Src.Binop [(var "x", op)] (var "y")
10194
10295 tupleFn =
10396 do commas <- many1 comma
10497 let args = map (('v':) . show) [ 0 .. length commas ]
105− return $ mkFunc args (\var -> E.tuple (map var args))
98+ return $ mkFunc args (\var -> Src.tuple (map var args))
10699
107100 parenedExpr =
108101 do expressions <- padded (commaSep expr)
@@ -111,17 +104,17 @@ parensTerm =
111104 [expression] ->
112105 expression
113106 _ ->
114− A.at start end (E.tuple expressions)
107+ A.at start end (Src.tuple expressions)
115108 in
116109 do (start, mkExpr, end) <-
117110 located $ choice $
118− [ mkBinop <$> try (parens Binop.infixOp)
111+ [ mkBinop <$> try (parens (addLocation Binop.infixOp))
119112 , parens (tupleFn <|> parenedExpr)
120113 ]
121114 return (mkExpr start end)
122115
123116
124−recordTerm :: IParser Source.Expr
117+recordTerm :: IParser Src.RawExpr
125118recordTerm =
126119 addLocation $ brackets $ choice $
127120 [ do starter <- try (addLocation rLabel)
@@ -130,14 +123,14 @@ recordTerm =
130123 [ update starter
131124 , literal starter
132125 ]
133− , return (E.Record [])
126+ , return (Src.Record [])
134127 ]
135128 where
136129 update (A.A ann starter) =
137130 do try (string "|")
138131 whitespace
139132 fields <- commaSep1 field
140− return (E.Update (A.A ann (E.rawVar starter)) fields)
133+ return (Src.Update (A.A ann (Src.var starter)) fields)
141134
142135 literal (A.A _ starter) =
143136 do try equals
@@ -148,8 +141,8 @@ recordTerm =
148141 [ do try comma
149142 whitespace
150143 fields <- commaSep field
151− return (E.Record ((starter, value) : fields))
152− , return (E.Record [(starter, value)])
144+ return (Src.Record ((starter, value) : fields))
145+ , return (Src.Record [(starter, value)])
153146 ]
154147
155148 field =
@@ -159,11 +152,11 @@ recordTerm =
159152 return (key, value)
160153
161154
162−term :: IParser Source.Expr
155+term :: IParser Src.RawExpr
163156term =
164157 choice
165158 [ addLocation $ choice $
166− [ E.Literal <$> Literal.literal
159+ [ Src.Literal <$> Literal.literal
167160 , listTerm
168161 , accessor
169162 , negative
@@ -181,7 +174,7 @@ term =
181174-------- Applications --------
182175
183176
184−appExpr :: IParser Source.Expr
177+appExpr :: IParser Src.RawExpr
185178appExpr =
186179 expecting "an expression" $
187180 do t <- term
@@ -190,14 +183,14 @@ appExpr =
190183 return $
191184 case ts of
192185 [] -> t
193− _ -> List.foldl' (\f x -> A.merge f x $ E.App f x) t ts
186+ _ -> List.foldl' (\f x -> A.merge f x $ Src.App f x) t ts
194187
195188
196189
197190-------- Normal Expressions --------
198191
199192
200−expr :: IParser Source.Expr
193+expr :: IParser Src.RawExpr
201194expr =
202195 addLocation (choice [ letExpr, caseExpr, ifExpr ])
203196 <|> lambdaExpr
@@ -205,7 +198,7 @@ expr =
205198 <?> "an expression"
206199
207200
208−binaryExpr :: IParser Source.Expr
201+binaryExpr :: IParser Src.RawExpr
209202binaryExpr =
210203 Binop.binops appExpr lastExpr
211204 where
@@ -215,12 +208,12 @@ binaryExpr =
215208 <?> "an expression"
216209
217210
218−ifExpr :: IParser Source.Expr'
211+ifExpr :: IParser Src.RawExpr'
219212ifExpr =
220213 ifHelp []
221214
222215
223−ifHelp :: [(Source.Expr, Source.Expr)] -> IParser Source.Expr'
216+ifHelp :: [(Src.RawExpr, Src.RawExpr)] -> IParser Src.RawExpr'
224217ifHelp branches =
225218 do try (reserved "if")
226219 whitespace
@@ -233,11 +226,11 @@ ifHelp branches =
233226 let newBranches = (condition, thenBranch) : branches
234227 choice
235228 [ ifHelp newBranches
236− , E.If (reverse newBranches) <$> expr
229+ , Src.If (reverse newBranches) <$> expr
237230 ]
238231
239232
240−lambdaExpr :: IParser Source.Expr
233+lambdaExpr :: IParser Src.RawExpr
241234lambdaExpr =
242235 do start <- getMyPosition
243236 char '\\' <|> char '\x03BB' <?> "an anonymous function"
@@ -246,22 +239,22 @@ lambdaExpr =
246239 padded rightArrow
247240 body <- expr
248241 end <- getMyPosition
249− return (foldr (\a b -> A.at start end $ E.Lambda a b) body args)
242+ return (foldr (\a b -> A.at start end $ Src.Lambda a b) body args)
250243
251244
252−caseExpr :: IParser Source.Expr'
245+caseExpr :: IParser Src.RawExpr'
253246caseExpr =
254247 do try (reserved "case")
255248 exp <- padded expr
256249 reserved "of"
257250 whitespace
258− Indent.withPos $
251+ Help.withPos $
259252 do firstBranch <- branch
260253 branches <-
261254 many $ do
262− try (whitespace >> Indent.checkIndent)
255+ try (whitespace >> Help.checkIndent)
263256 branch
264− return $ E.Case exp (firstBranch : branches)
257+ return $ Src.Case exp (firstBranch : branches)
265258 where
266259 branch =
267260 do p <- Pattern.expr
@@ -273,20 +266,20 @@ caseExpr =
273266-- LET
274267
275268
276−letExpr :: IParser Source.Expr'
269+letExpr :: IParser Src.RawExpr'
277270letExpr =
278271 do try (reserved "let")
279272 whitespace
280− defs <- Indent.block (def <* whitespace)
273+ defs <- Help.block (def <* whitespace)
281274 whitespace
282275 reserved "in"
283276 whitespace
284− E.Let defs <$> expr
277+ Src.Let defs <$> expr
285278
286279
287−def :: IParser Source.Def
280+def :: IParser Src.RawDef
288281def =
289− addLocation $ Indent.withPos $
282+ addLocation $ Help.withPos $
290283 do start <- defStart
291284 whitespace
292285 case start of
@@ -295,7 +288,7 @@ def =
295288 [ do hasType
296289 whitespace
297290 tipe <- Type.expr
298− return $ Source.Annotation name tipe
291+ return $ Src.Annotation name tipe
299292 , defEnd start []
300293 ]
301294
@@ -311,7 +304,7 @@ defStart =
311304 ]
312305
313306
314−defEnd :: P.Raw -> [P.Raw] -> IParser Source.Def'
307+defEnd :: P.Raw -> [P.Raw] -> IParser Src.RawDef'
315308defEnd start revArgs =
316309 choice
317310 [ do arg <- Pattern.term
@@ -320,10 +313,10 @@ defEnd start revArgs =
320313 , do equals
321314 whitespace
322315 body <- expr
323− return $ Source.Definition start (makeFunction revArgs body)
316+ return $ Src.Definition start (makeFunction revArgs body)
324317 ]
325318
326319
327−makeFunction :: [P.Raw] -> Source.Expr -> Source.Expr
320+makeFunction :: [P.Raw] -> Src.RawExpr -> Src.RawExpr
328321makeFunction revArgs body@(A.A ann _) =
329− List.foldl' (\expr arg -> A.A ann $ E.Lambda arg expr) body revArgs
322+ List.foldl' (\expr arg -> A.A ann $ Src.Lambda arg expr) body revArgs