@@ -1,6 +1,10 @@
1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3−module Parse.Expression (term, expression, definition) where
3+module Parse.Expression
5import Control.Monad (guard)
9import Control.Monad (guard)
6import qualified Data.List as List
10import qualified Data.List as List
@@ -26,7 +30,7 @@ import qualified Reporting.Region as R
29−term :: Parser Src.RawExpr
33+term :: Parser Src.Expr
31 hint E.Expr $
35 hint E.Expr $
32 do start <- getPosition
36 do start <- getPosition
@@ -41,14 +45,14 @@ term =
44−literal :: R.Position -> Parser Src.RawExpr
48+literal :: R.Position -> Parser Src.Expr
45literal start =
49literal start =
46 do value <- Literal.literal
50 do value <- Literal.literal
47 end <- getPosition
51 end <- getPosition
48 return (A.at start end (Src.Literal value))
52 return (A.at start end (Src.Literal value))
51−accessor :: R.Position -> Parser Src.RawExpr
55+accessor :: R.Position -> Parser Src.Expr
52accessor start =
56accessor start =
53 do Symbol.dot
57 do Symbol.dot
54 field <- Var.lower
58 field <- Var.lower
@@ -56,14 +60,14 @@ accessor start =
56 return (A.at start end (Src.Accessor field))
60 return (A.at start end (Src.Accessor field))
59−variable :: R.Position -> Parser Src.RawExpr
63+variable :: R.Position -> Parser Src.Expr
60variable start =
64variable start =
61 do (maybePrefix, name) <- Var.foreignAlpha
65 do (maybePrefix, name) <- Var.foreignAlpha
62 end <- getPosition
66 end <- getPosition
63 return (A.at start end (Src.Var maybePrefix name))
67 return (A.at start end (Src.Var maybePrefix name))
66−accessible :: R.Position -> Src.RawExpr -> Parser Src.RawExpr
70+accessible :: R.Position -> Src.Expr -> Parser Src.Expr
67accessible start expr =
71accessible start expr =
69 [ do Symbol.dot
73 [ do Symbol.dot
@@ -79,7 +83,7 @@ accessible start expr =
82−list :: R.Position -> Parser Src.RawExpr
86+list :: R.Position -> Parser Src.Expr
83list start =
87list start =
84 do Symbol.leftSquare
88 do Symbol.leftSquare
85 inContext start E.ExprList $
89 inContext start E.ExprList $
@@ -94,7 +98,7 @@ list start =
97−listHelp :: R.Position -> [Src.RawExpr] -> Parser Src.RawExpr
101+listHelp :: R.Position -> [Src.Expr] -> Parser Src.Expr
98listHelp start entries =
102listHelp start entries =
100 [ do Symbol.comma
104 [ do Symbol.comma
@@ -112,7 +116,7 @@ listHelp start entries =
115−tuple :: R.Position -> Parser Src.RawExpr
119+tuple :: R.Position -> Parser Src.Expr
116tuple start =
120tuple start =
117 do Symbol.leftParen
121 do Symbol.leftParen
118 pos <- getPosition
122 pos <- getPosition
@@ -142,7 +146,7 @@ tuple start =
145−tupleHelp :: R.Position -> Src.RawExpr -> [Src.RawExpr] -> Parser Src.RawExpr
149+tupleHelp :: R.Position -> Src.Expr -> [Src.Expr] -> Parser Src.Expr
146tupleHelp start firstExpr revExprs =
150tupleHelp start firstExpr revExprs =
148 [ do Symbol.comma
152 [ do Symbol.comma
@@ -165,7 +169,7 @@ tupleHelp start firstExpr revExprs =
165-- RECORDS
169-- RECORDS
168−record :: R.Position -> Parser Src.RawExpr
172+record :: R.Position -> Parser Src.Expr
169record start =
173record start =
170 do Symbol.leftCurly
174 do Symbol.leftCurly
171 inContext start E.ExprRecord $
175 inContext start E.ExprRecord $
@@ -194,7 +198,7 @@ record start =
197−type Field = ( A.Located Text, Src.RawExpr )
201+type Field = ( A.Located Text, Src.Expr )
200chompFields :: [Field] -> Parser [Field]
204chompFields :: [Field] -> Parser [Field]
@@ -225,7 +229,7 @@ chompField =
227type ExprParser =
231type ExprParser =
228− SParser Src.RawExpr
232+ SParser Src.Expr
231expression :: ExprParser
235expression :: ExprParser
@@ -237,24 +241,25 @@ expression =
237 , if_ start
241 , if_ start
238 , case_ start
242 , case_ start
239 , function start
243 , function start
240− , do starter <- possiblyNegativeTerm start
244+ , do expr <- possiblyNegativeTerm start
241 end <- getPosition
245 end <- getPosition
242 space <- W.whitespace
246 space <- W.whitespace
243− exprHelp start (State [] starter end space)
247+ exprHelp start (State [] expr [] end space)
247data State =
251data State =
249− { _ops :: ![(Src.RawExpr, A.Located Text)]
253+ { _ops :: ![(Src.Expr, A.Located Text)]
250− , _last :: !Src.RawExpr
254+ , _expr :: !Src.Expr
255+ , _args :: ![Src.Expr]
251 , _end :: !R.Position
256 , _end :: !R.Position
252 , _pos :: !SPos
257 , _pos :: !SPos
256exprHelp :: R.Position -> State -> ExprParser
261exprHelp :: R.Position -> State -> ExprParser
257−exprHelp start (State ops lastExpr end pos) =
262+exprHelp start (State ops expr args end pos) =
259 [ -- argument
264 [ -- argument
260 hint E.Arg $
265 hint E.Arg $
@@ -262,8 +267,7 @@ exprHelp start (State ops lastExpr end pos) =
262 arg <- term
267 arg <- term
263 newEnd <- getPosition
268 newEnd <- getPosition
264 newPos <- W.whitespace
269 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)
268 , -- infix operator
272 , -- infix operator
269 do checkSpace pos
273 do checkSpace pos
@@ -280,19 +284,15 @@ exprHelp start (State ops lastExpr end pos) =
280 rawTerm <- term
284 rawTerm <- term
281 newEnd <- getPosition
285 newEnd <- getPosition
282 newPos <- W.whitespace
286 newPos <- W.whitespace
283−
287+ let arg = A.at opStart newEnd (Src.Negate rawTerm)
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)
288− exprHelp start (State ops newLast newEnd newPos)
288+ exprHelp start (State ops expr (arg:args) newEnd newPos)
290 , -- term
290 , -- term
291− do newLast <- possiblyNegativeTerm newStart
291+ do newExpr <- possiblyNegativeTerm newStart
292 newEnd <- getPosition
292 newEnd <- getPosition
293 newPos <- W.whitespace
293 newPos <- W.whitespace
294− let newOps = (lastExpr, op) : ops
294+ let newOps = (toCall expr args, op) : ops
295− exprHelp start (State newOps newLast newEnd newPos)
295+ exprHelp start (State newOps newExpr [] newEnd newPos)
297 , -- final term
297 , -- final term
298 do (newLast, newEnd, newPos) <-
298 do (newLast, newEnd, newPos) <-
@@ -302,37 +302,43 @@ exprHelp start (State ops lastExpr end pos) =
302 , if_ newStart
302 , if_ newStart
303 , function newStart
303 , function newStart
305− let newOps = (lastExpr, op) : ops
305+ let newOps = (toCall expr args, op) : ops
306− let finalExpr = A.at start newEnd (Src.Binop (reverse newOps) newLast)
306+ let finalExpr = A.at start newEnd (Src.Binops (reverse newOps) newLast)
307 return ( finalExpr, newEnd, newPos )
307 return ( finalExpr, newEnd, newPos )
310 , -- done
310 , -- done
311+ let finalExpr = toCall expr args in
311 case ops of
312 case ops of
313− return ( lastExpr, end, pos )
314+ return ( finalExpr, end, pos )
318− A.at start end (Src.Binop (reverse ops) lastExpr)
317+ return ( A.at start end (Src.Binops (reverse ops) finalExpr), end, pos )
320− return ( finalExpr, end, pos )
324−possiblyNegativeTerm :: R.Position -> Parser Src.RawExpr
321+possiblyNegativeTerm :: R.Position -> Parser Src.Expr
325possiblyNegativeTerm start =
322possiblyNegativeTerm start =
327 [ do Symbol.minus
324 [ do Symbol.minus
328 expr <- term
325 expr <- term
329 end <- getPosition
326 end <- getPosition
330− let ann x = A.at start end x
327+ return (A.at start end (Src.Negate expr))
331− return (ann (Src.Binop [(ann Src.zero, ann "-")] expr))
332+toCall :: Src.Expr -> [Src.Expr] -> Src.Expr
333+toCall func revArgs =
339+ A.merge func lastArg (Src.Call func (reverse revArgs))
337-- IF EXPRESSION
343-- IF EXPRESSION
@@ -343,7 +349,7 @@ if_ start =
343 inContext start E.ExprIf $ ifHelp start []
349 inContext start E.ExprIf $ ifHelp start []
346−ifHelp :: R.Position -> [(Src.RawExpr, Src.RawExpr)] -> ExprParser
352+ifHelp :: R.Position -> [(Src.Expr, Src.Expr)] -> ExprParser
347ifHelp start branches =
353ifHelp start branches =
348 do spaces
354 do spaces
349 (condition, _, condPos) <- expression
355 (condition, _, condPos) <- expression
@@ -419,7 +425,7 @@ case_ start =
422−branchHelp :: SParser (P.Raw, Src.RawExpr)
428+branchHelp :: SParser (P.Raw, Src.Expr)
423branchHelp =
429branchHelp =
424 do (pattern, patternPos) <- Pattern.expression
430 do (pattern, patternPos) <- Pattern.expression
425 checkSpace patternPos
431 checkSpace patternPos
@@ -429,7 +435,7 @@ branchHelp =
429 return ( (pattern, branchExpr), end, pos )
435 return ( (pattern, branchExpr), end, pos )
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)]
433caseHelp branches end pos =
439caseHelp branches end pos =
435 [ do checkAligned pos
441 [ do checkAligned pos
@@ -457,7 +463,7 @@ let_ start =
457 letHelp start oldIndent [def] end space
463 letHelp start oldIndent [def] end space
460−letHelp :: R.Position -> Int -> [Src.RawDef] -> R.Position -> SPos -> ExprParser
466+letHelp :: R.Position -> Int -> [A.Located Src.Def] -> R.Position -> SPos -> ExprParser
461letHelp start oldIndent revDefs end pos =
467letHelp start oldIndent revDefs end pos =
463 [ do checkAligned pos
469 [ do checkAligned pos
@@ -479,7 +485,7 @@ letHelp start oldIndent revDefs end pos =
479-- LET DEFINITIONS
485-- LET DEFINITIONS
482−letDef :: SParser Src.RawDef
488+letDef :: SParser (A.Located Src.Def)
485 [ definition
491 [ definition
@@ -491,7 +497,7 @@ letDef =
491-- DEFINITION
497-- DEFINITION
494−definition :: SParser Src.RawDef
500+definition :: SParser (A.Located Src.Def)
495definition =
501definition =
496 do start <- getPosition
502 do start <- getPosition
497 name <- Var.lower
503 name <- Var.lower
@@ -501,13 +507,13 @@ definition =
501 inContext start (E.Annotation name) $
507 inContext start (E.Annotation name) $
502 do spaces
508 do spaces
503 (tipe, end, space) <- Type.expression
509 (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 )
505 , inContext start (E.Definition name) $
511 , inContext start (E.Definition name) $
506 definitionHelp start name []
512 definitionHelp start name []
510−definitionHelp :: R.Position -> Text -> [P.Raw] -> SParser Src.RawDef
516+definitionHelp :: R.Position -> Text -> [P.Raw] -> SParser (A.Located Src.Def)
511definitionHelp start name revArgs =
517definitionHelp start name revArgs =
513 [ do arg <- hint E.Arg Pattern.term
519 [ do arg <- hint E.Arg Pattern.term
@@ -516,7 +522,7 @@ definitionHelp start name revArgs =
516 , do Symbol.equals
522 , do Symbol.equals
518 (body, end, space) <- expression
524 (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)
520 return ( def, end, space )
526 return ( def, end, space )
@@ -525,7 +531,7 @@ definitionHelp start name revArgs =
525-- DESTRUCTURE
531-- DESTRUCTURE
528−destructure :: SParser Src.RawDef
534+destructure :: SParser (A.Located Src.Def)
529destructure =
535destructure =
530 do start <- getPosition
536 do start <- getPosition
531 pattern <- Pattern.term
537 pattern <- Pattern.term
@@ -533,5 +539,4 @@ destructure =
533 Symbol.equals
539 Symbol.equals
535 (expr, end, space) <- expression
541 (expr, end, space) <- expression
536− let def = A.at start end (Src.Destructure pattern expr)
542+ return ( A.at start end (Src.Destruct pattern expr), end, space )
537− return ( def, end, space )