@@ -1,4 +1,4 @@
1−module Parse.Expression (def,term) where
1+module Parse.Expression {-(def,term)-} where
3import Control.Applicative ((<$>), (<*>))
3import Control.Applicative ((<$>), (<*>))
4import Data.List (foldl')
4import Data.List (foldl')
@@ -12,6 +12,7 @@ import qualified Parse.Type as Type
12import Parse.Binop
12import Parse.Binop
13import Parse.Literal
13import Parse.Literal
15+import SourceSyntax.PrettyPrint
15import SourceSyntax.Location as Location
16import SourceSyntax.Location as Location
16import SourceSyntax.Pattern hiding (tuple,list)
17import SourceSyntax.Pattern hiding (tuple,list)
17import qualified SourceSyntax.Literal as Literal
18import qualified SourceSyntax.Literal as Literal
@@ -21,14 +22,13 @@ import SourceSyntax.Declaration (Declaration(Definition))
21import Unique
22import Unique
22import Types.Types (Type (VarT), Scheme (Forall))
23import Types.Types (Type (VarT), Scheme (Forall))
24−import System.IO.Unsafe
27-------- Basic Terms --------
26-------- Basic Terms --------
29varTerm :: IParser (Expr t v)
28varTerm :: IParser (Expr t v)
30varTerm = toVar <$> var <?> "variable"
29varTerm = toVar <$> var <?> "variable"
31+toVar :: String -> Expr t v
32toVar v = case v of "True" -> Literal (Literal.Boolean True)
32toVar v = case v of "True" -> Literal (Literal.Boolean True)
33 "False" -> Literal (Literal.Boolean False)
33 "False" -> Literal (Literal.Boolean False)
34 _ -> Var v
34 _ -> Var v
@@ -39,7 +39,7 @@ accessor = do
39 lbl <- try (string "." >> rLabel)
39 lbl <- try (string "." >> rLabel)
40 end <- getPosition
40 end <- getPosition
41 let loc e = Location.add ("." ++ lbl) (Location.at start end e)
41 let loc e = Location.add ("." ++ lbl) (Location.at start end e)
42− return (Lambda "_" (loc $ Access (loc $ Var "_") lbl))
42+ return (Lambda (PVar "_") (loc $ Access (loc $ Var "_") lbl))
45-------- Complex Terms --------
45-------- Complex Terms --------
@@ -61,7 +61,7 @@ parensTerm = parens $ choice
61 op <- try anyOp
61 op <- try anyOp
62 end <- getPosition
62 end <- getPosition
63 let loc = Location.at start end
63 let loc = Location.at start end
64− return . loc . Lambda "x" . loc . Lambda "y" . loc $
64+ return . loc . Lambda (PVar "x") . loc . Lambda (PVar "y") . loc $
65 Binop op (loc $ Var "x") (loc $ Var "y")
65 Binop op (loc $ Var "x") (loc $ Var "y")
66 , do start <- getPosition
66 , do start <- getPosition
67 let comma = char ',' <?> "comma ','"
67 let comma = char ',' <?> "comma ','"
@@ -70,7 +70,7 @@ parensTerm = parens $ choice
70 let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
70 let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
71 loc = Location.at start end
71 loc = Location.at start end
72 return $ foldr (\x e -> loc $ Lambda x e)
72 return $ foldr (\x e -> loc $ Lambda x e)
73− (loc . tuple $ map (loc . Var) vars) vars
73+ (loc . tuple $ map (loc . Var) vars) (map PVar vars)
74 , do start <- getPosition
74 , do start <- getPosition
75 es <- commaSep expr
75 es <- commaSep expr
76 end <- getPosition
76 end <- getPosition
@@ -83,14 +83,11 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
83 where field = do
83 where field = do
84 label <- rLabel
84 label <- rLabel
85 patterns <- spacePrefix Pattern.term
85 patterns <- spacePrefix Pattern.term
87− e <- string "=" >> whitespace >> expr
86+ whitespace >> string "=" >> whitespace
88− return (label, foldr Lambda e patterns)
88+ return (label, makeFunction patterns body)
90− extract [ Def f args exp ] = return (f,args,exp)
91− extract _ = fail "Improperly formed record field."
93− record = Record <$> (mapM extract =<< commaSep field)
90+ record = Record <$> commaSep field
95 change = do
92 change = do
96 lbl <- rLabel
93 lbl <- rLabel
@@ -156,13 +153,13 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
156lambdaExpr :: IParser (LExpr t v)
153lambdaExpr :: IParser (LExpr t v)
157lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
154lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
158 whitespace
155 whitespace
159− pats <- spaceSep1 Pattern.term
156+ args <- spaceSep1 Pattern.term
160 whitespace ; arrow ; whitespace
157 whitespace ; arrow ; whitespace
161− e <- expr
158+ body <- expr
162− return (foldr Lambda pats e)
159+ return (makeFunction args body)
164defSet :: IParser [Def t v]
161defSet :: IParser [Def t v]
165−defSet = concat <$> block (do d <- anyDef ; whitespace ; return d)
162+defSet = block (do d <- anyDef ; whitespace ; return d)
167letExpr :: IParser (Expr t v)
164letExpr :: IParser (Expr t v)
168letExpr = do
165letExpr = do
@@ -197,19 +194,23 @@ funcDef = try (do p1 <- try Pattern.term ; infics p1 <|> func p1)
197 return $ if o == '`' then [ PVar $ takeWhile (/='`') p, p1, p2 ]
194 return $ if o == '`' then [ PVar $ takeWhile (/='`') p, p1, p2 ]
198 else [ PVar (o:p), p1, p2 ]
195 else [ PVar (o:p), p1, p2 ]
197+makeFunction :: [Pattern] -> LExpr t v -> LExpr t v
198+makeFunction args body@(L a b _) =
200+ foldr (\arg body' -> pos $ Lambda arg body') body args
200−assignExpr :: IParser [Def t v]
202+assignExpr :: IParser (Def t v)
201assignExpr = withPos $ do
203assignExpr = withPos $ do
202− fDefs <- funcDef
204+ (name:args) <- funcDef
204− e <- string "=" >> whitespace >> expr
205+ whitespace >> string "=" >> whitespace
205− n <- sourceLine <$> getPosition
206+ body <- expr
206− runAt (1000 * n) $ Pattern.flatten fDefs e
207+ return . Def name $ makeFunction args body
208−anyDef =
209+anyDef :: IParser (Def t v)
209− ((\d -> [d]) <$> Type.annotation) <|>
210+anyDef = Type.annotation <|> assignExpr
212+def :: IParser (Declaration t v)
212−def = map Definition <$> anyDef
213+def = Definition <$> anyDef
214parseDef str =
215parseDef str =
215 case iParse def "" str of
216 case iParse def "" str of