@@ -1,6 +1,10 @@
11{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
22{-# LANGUAGE OverloadedStrings #-}
3−module Parse.Expression (term, expression, definition) where
3+module Parse.Expression
4+ ( expression
5+ )
6+ where
7+
48
59import Control.Monad (guard)
610import qualified Data.List as List
@@ -26,7 +30,7 @@ import qualified Reporting.Region as R
2630-- TERMS
2731
2832
29−term :: Parser Src.RawExpr
33+term :: Parser Src.Expr
3034term =
3135 hint E.Expr $
3236 do start <- getPosition
@@ -41,14 +45,14 @@ term =
4145 ]
4246
4347
44−literal :: R.Position -> Parser Src.RawExpr
48+literal :: R.Position -> Parser Src.Expr
4549literal start =
4650 do value <- Literal.literal
4751 end <- getPosition
4852 return (A.at start end (Src.Literal value))
4953
5054
51−accessor :: R.Position -> Parser Src.RawExpr
55+accessor :: R.Position -> Parser Src.Expr
5256accessor start =
5357 do Symbol.dot
5458 field <- Var.lower
@@ -56,14 +60,14 @@ accessor start =
5660 return (A.at start end (Src.Accessor field))
5761
5862
59−variable :: R.Position -> Parser Src.RawExpr
63+variable :: R.Position -> Parser Src.Expr
6064variable start =
6165 do (maybePrefix, name) <- Var.foreignAlpha
6266 end <- getPosition
6367 return (A.at start end (Src.Var maybePrefix name))
6468
6569
66−accessible :: R.Position -> Src.RawExpr -> Parser Src.RawExpr
70+accessible :: R.Position -> Src.Expr -> Parser Src.Expr
6771accessible start expr =
6872 oneOf
6973 [ do Symbol.dot
@@ -79,7 +83,7 @@ accessible start expr =
7983-- LISTS
8084
8185
82−list :: R.Position -> Parser Src.RawExpr
86+list :: R.Position -> Parser Src.Expr
8387list start =
8488 do Symbol.leftSquare
8589 inContext start E.ExprList $
@@ -94,7 +98,7 @@ list start =
9498 ]
9599
96100
97−listHelp :: R.Position -> [Src.RawExpr] -> Parser Src.RawExpr
101+listHelp :: R.Position -> [Src.Expr] -> Parser Src.Expr
98102listHelp start entries =
99103 oneOf
100104 [ do Symbol.comma
@@ -112,7 +116,7 @@ listHelp start entries =
112116-- TUPLES
113117
114118
115−tuple :: R.Position -> Parser Src.RawExpr
119+tuple :: R.Position -> Parser Src.Expr
116120tuple start =
117121 do Symbol.leftParen
118122 pos <- getPosition
@@ -142,7 +146,7 @@ tuple start =
142146 ]
143147
144148
145−tupleHelp :: R.Position -> Src.RawExpr -> [Src.RawExpr] -> Parser Src.RawExpr
149+tupleHelp :: R.Position -> Src.Expr -> [Src.Expr] -> Parser Src.Expr
146150tupleHelp start firstExpr revExprs =
147151 oneOf
148152 [ do Symbol.comma
@@ -165,7 +169,7 @@ tupleHelp start firstExpr revExprs =
165169-- RECORDS
166170
167171
168−record :: R.Position -> Parser Src.RawExpr
172+record :: R.Position -> Parser Src.Expr
169173record start =
170174 do Symbol.leftCurly
171175 inContext start E.ExprRecord $
@@ -194,7 +198,7 @@ record start =
194198 ]
195199
196200
197−type Field = ( A.Located Text, Src.RawExpr )
201+type Field = ( A.Located Text, Src.Expr )
198202
199203
200204chompFields :: [Field] -> Parser [Field]
@@ -225,7 +229,7 @@ chompField =
225229
226230
227231type ExprParser =
228− SParser Src.RawExpr
232+ SParser Src.Expr
229233
230234
231235expression :: ExprParser
@@ -237,24 +241,25 @@ expression =
237241 , if_ start
238242 , case_ start
239243 , function start
240− , do starter <- possiblyNegativeTerm start
244+ , do expr <- possiblyNegativeTerm start
241245 end <- getPosition
242246 space <- W.whitespace
243− exprHelp start (State [] starter end space)
247+ exprHelp start (State [] expr [] end space)
244248 ]
245249
246250
247251data State =
248252 State
249− { _ops :: ![(Src.RawExpr, A.Located Text)]
250− , _last :: !Src.RawExpr
253+ { _ops :: ![(Src.Expr, A.Located Text)]
254+ , _expr :: !Src.Expr
255+ , _args :: ![Src.Expr]
251256 , _end :: !R.Position
252257 , _pos :: !SPos
253258 }
254259
255260
256261exprHelp :: R.Position -> State -> ExprParser
257−exprHelp start (State ops lastExpr end pos) =
262+exprHelp start (State ops expr args end pos) =
258263 oneOf
259264 [ -- argument
260265 hint E.Arg $
@@ -262,8 +267,7 @@ exprHelp start (State ops lastExpr end pos) =
262267 arg <- term
263268 newEnd <- getPosition
264269 newPos <- W.whitespace
265− let newLast = A.merge lastExpr arg (Src.App lastExpr arg)
266− exprHelp start (State ops newLast newEnd newPos)
270+ exprHelp start (State ops expr (arg:args) newEnd newPos)
267271
268272 , -- infix operator
269273 do checkSpace pos
@@ -280,19 +284,15 @@ exprHelp start (State ops lastExpr end pos) =
280284 rawTerm <- term
281285 newEnd <- getPosition
282286 newPos <- W.whitespace
283−
284− let ann x = A.merge op rawTerm x
285− let negatedTerm = ann (Src.Binop [(ann Src.zero, op)] rawTerm)
286− let newLast = A.merge lastExpr rawTerm (Src.App lastExpr negatedTerm)
287−
288− exprHelp start (State ops newLast newEnd newPos)
287+ let arg = A.at opStart newEnd (Src.Negate rawTerm)
288+ exprHelp start (State ops expr (arg:args) newEnd newPos)
289289
290290 , -- term
291− do newLast <- possiblyNegativeTerm newStart
291+ do newExpr <- possiblyNegativeTerm newStart
292292 newEnd <- getPosition
293293 newPos <- W.whitespace
294− let newOps = (lastExpr, op) : ops
295− exprHelp start (State newOps newLast newEnd newPos)
294+ let newOps = (toCall expr args, op) : ops
295+ exprHelp start (State newOps newExpr [] newEnd newPos)
296296
297297 , -- final term
298298 do (newLast, newEnd, newPos) <-
@@ -302,37 +302,43 @@ exprHelp start (State ops lastExpr end pos) =
302302 , if_ newStart
303303 , function newStart
304304 ]
305− let newOps = (lastExpr, op) : ops
306− let finalExpr = A.at start newEnd (Src.Binop (reverse newOps) newLast)
305+ let newOps = (toCall expr args, op) : ops
306+ let finalExpr = A.at start newEnd (Src.Binops (reverse newOps) newLast)
307307 return ( finalExpr, newEnd, newPos )
308308 ]
309309
310310 , -- done
311+ let finalExpr = toCall expr args in
311312 case ops of
312313 [] ->
313− return ( lastExpr, end, pos )
314+ return ( finalExpr, end, pos )
314315
315316 _ ->
316− let
317− finalExpr =
318− A.at start end (Src.Binop (reverse ops) lastExpr)
319− in
320− return ( finalExpr, end, pos )
317+ return ( A.at start end (Src.Binops (reverse ops) finalExpr), end, pos )
321318 ]
322319
323320
324−possiblyNegativeTerm :: R.Position -> Parser Src.RawExpr
321+possiblyNegativeTerm :: R.Position -> Parser Src.Expr
325322possiblyNegativeTerm start =
326323 oneOf
327324 [ do Symbol.minus
328325 expr <- term
329326 end <- getPosition
330− let ann x = A.at start end x
331− return (ann (Src.Binop [(ann Src.zero, ann "-")] expr))
327+ return (A.at start end (Src.Negate expr))
332328 , term
333329 ]
334330
335331
332+toCall :: Src.Expr -> [Src.Expr] -> Src.Expr
333+toCall func revArgs =
334+ case revArgs of
335+ [] ->
336+ func
337+
338+ lastArg : _ ->
339+ A.merge func lastArg (Src.Call func (reverse revArgs))
340+
341+
336342
337343-- IF EXPRESSION
338344
@@ -343,7 +349,7 @@ if_ start =
343349 inContext start E.ExprIf $ ifHelp start []
344350
345351
346−ifHelp :: R.Position -> [(Src.RawExpr, Src.RawExpr)] -> ExprParser
352+ifHelp :: R.Position -> [(Src.Expr, Src.Expr)] -> ExprParser
347353ifHelp start branches =
348354 do spaces
349355 (condition, _, condPos) <- expression
@@ -419,7 +425,7 @@ case_ start =
419425 )
420426
421427
422−branchHelp :: SParser (P.Raw, Src.RawExpr)
428+branchHelp :: SParser (P.Raw, Src.Expr)
423429branchHelp =
424430 do (pattern, patternPos) <- Pattern.expression
425431 checkSpace patternPos
@@ -429,7 +435,7 @@ branchHelp =
429435 return ( (pattern, branchExpr), end, pos )
430436
431437
432−caseHelp :: [(P.Raw, Src.RawExpr)] -> R.Position -> SPos -> SParser [(P.Raw, Src.RawExpr)]
438+caseHelp :: [(P.Raw, Src.Expr)] -> R.Position -> SPos -> SParser [(P.Raw, Src.Expr)]
433439caseHelp branches end pos =
434440 oneOf
435441 [ do checkAligned pos
@@ -457,7 +463,7 @@ let_ start =
457463 letHelp start oldIndent [def] end space
458464
459465
460−letHelp :: R.Position -> Int -> [Src.RawDef] -> R.Position -> SPos -> ExprParser
466+letHelp :: R.Position -> Int -> [A.Located Src.Def] -> R.Position -> SPos -> ExprParser
461467letHelp start oldIndent revDefs end pos =
462468 oneOf
463469 [ do checkAligned pos
@@ -479,7 +485,7 @@ letHelp start oldIndent revDefs end pos =
479485-- LET DEFINITIONS
480486
481487
482−letDef :: SParser Src.RawDef
488+letDef :: SParser (A.Located Src.Def)
483489letDef =
484490 oneOf
485491 [ definition
@@ -491,7 +497,7 @@ letDef =
491497-- DEFINITION
492498
493499
494−definition :: SParser Src.RawDef
500+definition :: SParser (A.Located Src.Def)
495501definition =
496502 do start <- getPosition
497503 name <- Var.lower
@@ -501,13 +507,13 @@ definition =
501507 inContext start (E.Annotation name) $
502508 do spaces
503509 (tipe, end, space) <- Type.expression
504− return ( A.at start end (Src.Annotation name tipe), end, space )
510+ return ( A.at start end (Src.Annotate name tipe), end, space )
505511 , inContext start (E.Definition name) $
506512 definitionHelp start name []
507513 ]
508514
509515
510−definitionHelp :: R.Position -> Text -> [P.Raw] -> SParser Src.RawDef
516+definitionHelp :: R.Position -> Text -> [P.Raw] -> SParser (A.Located Src.Def)
511517definitionHelp start name revArgs =
512518 oneOf
513519 [ do arg <- hint E.Arg Pattern.term
@@ -516,7 +522,7 @@ definitionHelp start name revArgs =
516522 , do Symbol.equals
517523 spaces
518524 (body, end, space) <- expression
519− let def = A.at start end (Src.Definition name (reverse revArgs) body)
525+ let def = A.at start end (Src.Define name (reverse revArgs) body)
520526 return ( def, end, space )
521527 ]
522528
@@ -525,7 +531,7 @@ definitionHelp start name revArgs =
525531-- DESTRUCTURE
526532
527533
528−destructure :: SParser Src.RawDef
534+destructure :: SParser (A.Located Src.Def)
529535destructure =
530536 do start <- getPosition
531537 pattern <- Pattern.term
@@ -533,5 +539,4 @@ destructure =
533539 Symbol.equals
534540 spaces
535541 (expr, end, space) <- expression
536− let def = A.at start end (Src.Destructure pattern expr)
537− return ( def, end, space )
542+ return ( A.at start end (Src.Destruct pattern expr), end, space )