@@ -1,4 +1,4 @@
1−module Parse.Expression (def,term,typeAnnotation,expr) where
1+module Parse.Expression (def, term, typeAnnotation, expr) where
3import Control.Applicative ((<$>), (<*>))
3import Control.Applicative ((<$>), (<*>))
4import qualified Data.List as List
4import qualified Data.List as List
@@ -85,7 +85,7 @@ parensTerm =
85 loc = Annotation.at start end
85 loc = Annotation.at start end
86 return $ foldr (\x e -> loc $ E.Lambda x e)
86 return $ foldr (\x e -> loc $ E.Lambda x e)
87 (loc . E.tuple $ map (loc . E.rawVar) vars) (map P.Var vars)
87 (loc . E.tuple $ map (loc . E.rawVar) vars) (map P.Var vars)
89 parened = do
89 parened = do
90 (start, es, end) <- located (commaSep expr)
90 (start, es, end) <- located (commaSep expr)
91 return $ case es of
91 return $ case es of
@@ -102,7 +102,7 @@ recordTerm =
102 padded equals
102 padded equals
103 body <- expr
103 body <- expr
104 return (label, makeFunction patterns body)
104 return (label, makeFunction patterns body)
107 E.Record <$> commaSep field
107 E.Record <$> commaSep field
@@ -129,7 +129,7 @@ recordTerm =
129 case opt of
129 case opt of
130 Just e -> try (insert e) <|> return e
130 Just e -> try (insert e) <|> return e
131 Nothing -> try (insert record) <|> try (modify record)
131 Nothing -> try (insert record) <|> try (modify record)
134term :: IParser Source.Expr
134term :: IParser Source.Expr
135term = addLocation (choice [ E.Literal <$> Literal.literal, listTerm, accessor, negative ])
135term = addLocation (choice [ E.Literal <$> Literal.literal, listTerm, accessor, negative ])
@@ -152,6 +152,14 @@ appExpr =
153-------- Normal Expressions --------
153-------- Normal Expressions --------
155+expr :: IParser Source.Expr
157+ addLocation (choice [ ifExpr, letExpr, caseExpr ])
155binaryExpr :: IParser Source.Expr
163binaryExpr :: IParser Source.Expr
156binaryExpr =
164binaryExpr =
157 Binop.binops appExpr lastExpr anyOp
165 Binop.binops appExpr lastExpr anyOp
@@ -198,23 +206,6 @@ lambdaExpr =
198 return (makeFunction args body)
206 return (makeFunction args body)
201−defSet :: IParser [Source.Def]
209−letExpr :: IParser Source.Expr'
211− do try (reserved "let")
214− padded (reserved "in")
218caseExpr :: IParser Source.Expr'
209caseExpr :: IParser Source.Expr'
219caseExpr =
210caseExpr =
220 do try (reserved "case")
211 do try (reserved "case")
@@ -235,45 +226,30 @@ caseExpr =
235 block (do c <- case_ ; whitespace ; return c)
226 block (do c <- case_ ; whitespace ; return c)
238−expr :: IParser Source.Expr
229+-- LET
239−expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
231+letExpr :: IParser Source.Expr'
233+ do try (reserved "let")
236+ padded (reserved "in")
245−defStart :: IParser [P.RawPattern]
247− choice [ do p1 <- try Pattern.term
248− infics p1 <|> func p1
249− , func =<< (P.Var <$> parens symOp)
250− , (:[]) <$> Pattern.expr
251− ] <?> "the definition of a variable (x = ...)"
255− P.Var _ -> (pattern:) <$> spacePrefix Pattern.term
256− _ -> do try (lookAhead (whitespace >> string "="))
259− infics p1 = do
240+defSet :: IParser [Source.Def]
260− o:p <- try (whitespace >> anyOp)
241+defSet =
261− p2 <- (whitespace >> Pattern.term)
244+ whitespace
262− return $ if o == '`' then [ P.Var $ takeWhile (/='`') p, p1, p2 ]
245+ return d
263− else [ P.Var (o:p), p1, p2 ]
265−makeFunction :: [P.RawPattern] -> Source.Expr -> Source.Expr
266−makeFunction args body@(Annotation.A ann _) =
267− foldr (\arg body' -> Annotation.A ann $ E.Lambda arg body') body args
270−definition :: IParser Source.Def
250+def :: IParser Source.Def
271−definition =
251+def =
272− withPos $
252+ typeAnnotation <|> definition
273− do (name:args) <- defStart
276− return . Source.Definition name $ makeFunction args body
279typeAnnotation :: IParser Source.Def
255typeAnnotation :: IParser Source.Def
@@ -286,6 +262,41 @@ typeAnnotation =
289−def :: IParser Source.Def
265+definition :: IParser Source.Def
290−def =
266+definition =
268+ do (name:args) <- defStart
271+ return . Source.Definition name $ makeFunction args body
274+makeFunction :: [P.RawPattern] -> Source.Expr -> Source.Expr
275+makeFunction args body@(Annotation.A ann _) =
276+ foldr (\arg body' -> Annotation.A ann $ E.Lambda arg body') body args
279+defStart :: IParser [P.RawPattern]
282+ [ do p1 <- try Pattern.term
283+ infics p1 <|> func p1
284+ , func =<< (P.Var <$> parens symOp)
285+ , (:[]) <$> Pattern.expr
291− typeAnnotation <|> definition
287+ <?> "the definition of a variable (x = ...)"
291+ P.Var _ -> (pattern:) <$> spacePrefix Pattern.term
292+ _ -> do try (lookAhead (whitespace >> string "="))
296+ do o:p <- try (whitespace >> anyOp)
297+ p2 <- (whitespace >> Pattern.term)
300+ then [ P.Var $ takeWhile (/='`') p, p1, p2 ]
301+ else [ P.Var (o:p), p1, p2 ]