@@ -18,7 +18,7 @@ import qualified SourceSyntax.Literal as Literal
18import SourceSyntax.Expression
18import SourceSyntax.Expression
19import SourceSyntax.Declaration (Declaration(Definition))
19import SourceSyntax.Declaration (Declaration(Definition))
21−import Guid
21+import Unique
22import Types.Types (Type (VarT), Scheme (Forall))
22import Types.Types (Type (VarT), Scheme (Forall))
24import System.IO.Unsafe
24import System.IO.Unsafe
@@ -26,14 +26,14 @@ import System.IO.Unsafe
27-------- Basic Terms --------
27-------- Basic Terms --------
29−varTerm :: IParser Expr
29+varTerm :: IParser (Expr t v)
30varTerm = toVar <$> var <?> "variable"
30varTerm = toVar <$> var <?> "variable"
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
36−accessor :: IParser Expr
36+accessor :: IParser (Expr t v)
37accessor = do
37accessor = do
38 start <- getPosition
38 start <- getPosition
39 lbl <- try (string "." >> rLabel)
39 lbl <- try (string "." >> rLabel)
@@ -44,7 +44,7 @@ accessor = do
45-------- Complex Terms --------
45-------- Complex Terms --------
47−listTerm :: IParser Expr
47+listTerm :: IParser (Expr t v)
49 (do { try $ string "[markdown|"
49 (do { try $ string "[markdown|"
50 ; md <- filter (/='\r') <$> manyTill anyChar (try $ string "|]")
50 ; md <- filter (/='\r') <$> manyTill anyChar (try $ string "|]")
@@ -56,7 +56,7 @@ listTerm =
59−parensTerm :: IParser LExpr
59+parensTerm :: IParser (LExpr t v)
60parensTerm = parens $ choice
60parensTerm = parens $ choice
61 [ do start <- getPosition
61 [ do start <- getPosition
62 op <- try anyOp
62 op <- try anyOp
@@ -79,7 +79,7 @@ parensTerm = parens $ choice
79 _ -> Location.at start end (tuple es)
79 _ -> Location.at start end (tuple es)
82−recordTerm :: IParser LExpr
82+recordTerm :: IParser (LExpr t v)
83recordTerm = brackets $ choice [ misc, addLocation record ]
83recordTerm = brackets $ choice [ misc, addLocation record ]
84 where field = do
84 where field = do
85 fDefs <- (:) <$> (PVar <$> rLabel) <*> spacePrefix Pattern.term
85 fDefs <- (:) <$> (PVar <$> rLabel) <*> spacePrefix Pattern.term
@@ -111,14 +111,14 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
111 Nothing -> try (insert record) <|> try (modify record)
111 Nothing -> try (insert record) <|> try (modify record)
114−term :: IParser LExpr
114+term :: IParser (LExpr t v)
115term = addLocation (choice [ Literal <$> literal, listTerm, accessor ])
115term = addLocation (choice [ Literal <$> literal, listTerm, accessor ])
116 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
116 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
117 <?> "basic term (4, x, 'c', etc.)"
117 <?> "basic term (4, x, 'c', etc.)"
119-------- Applications --------
119-------- Applications --------
121−appExpr :: IParser LExpr
121+appExpr :: IParser (LExpr t v)
122appExpr = do
122appExpr = do
123 tlist <- spaceSep1 term
123 tlist <- spaceSep1 term
124 return $ case tlist of
124 return $ case tlist of
@@ -127,10 +127,10 @@ appExpr = do
128-------- Normal Expressions --------
128-------- Normal Expressions --------
130−binaryExpr :: IParser LExpr
130+binaryExpr :: IParser (LExpr t v)
131binaryExpr = binops [] appExpr anyOp
131binaryExpr = binops [] appExpr anyOp
133−ifExpr :: IParser Expr
133+ifExpr :: IParser (Expr t v)
134ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
134ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
136 normal = do
136 normal = do
@@ -145,7 +145,7 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
145 b <- expr ; whitespace ; string "->" ; whitespace
145 b <- expr ; whitespace ; string "->" ; whitespace
146 (,) b <$> expr
146 (,) b <$> expr
148−lambdaExpr :: IParser LExpr
148+lambdaExpr :: IParser (LExpr t v)
149lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
149lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
150 whitespace
150 whitespace
151 pats <- spaceSep1 Pattern.term
151 pats <- spaceSep1 Pattern.term
@@ -153,17 +153,17 @@ lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
153 e <- expr
153 e <- expr
154 return . run $ Pattern.makeLambda pats e
154 return . run $ Pattern.makeLambda pats e
156−defSet :: IParser [Def]
156+defSet :: IParser [Def t v]
157defSet = concat <$> block (do d <- anyDef ; whitespace ; return d)
157defSet = concat <$> block (do d <- anyDef ; whitespace ; return d)
159−letExpr :: IParser Expr
159+letExpr :: IParser (Expr t v)
160letExpr = do
160letExpr = do
161 reserved "let" ; whitespace
161 reserved "let" ; whitespace
162 defs <- defSet
162 defs <- defSet
163 whitespace ; reserved "in" ; whitespace
163 whitespace ; reserved "in" ; whitespace
164 Let defs <$> expr
164 Let defs <$> expr
166−caseExpr :: IParser Expr
166+caseExpr :: IParser (Expr t v)
167caseExpr = do
167caseExpr = do
168 reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
168 reserved "case"; whitespace; e <- expr; whitespace; reserved "of"; whitespace
169 Case e <$> (with <|> without)
169 Case e <$> (with <|> without)
@@ -189,7 +189,7 @@ funcDef = try (do p1 <- try Pattern.term ; infics p1 <|> func p1)
189 return $ if o == '`' then [ PVar $ takeWhile (/='`') p, p1, p2 ]
189 return $ if o == '`' then [ PVar $ takeWhile (/='`') p, p1, p2 ]
190 else [ PVar (o:p), p1, p2 ]
190 else [ PVar (o:p), p1, p2 ]
192−assignExpr :: IParser [Def]
192+assignExpr :: IParser [Def t v]
193assignExpr = withPos $ do
193assignExpr = withPos $ do
194 fDefs <- funcDef
194 fDefs <- funcDef
195 whitespace
195 whitespace