on master help sign in
Begin getting the parser to match the new SourceSyntax modules.
339ad77evancz
compiler/Model/Guid.hs → compiler/Guid.hsrenamed

The content is the same.

compiler/Model/Ast.hsdeleted−156
@@ -1,156 +0,0 @@
1−{-# LANGUAGE DeriveDataTypeable #-}
2−module Ast where
3−
4−import Located
5−import Data.Char (isDigit, isSymbol)
6−import Data.List (intercalate)
7−import Types.Types
8−import qualified Text.Pandoc as Pandoc
9−import Data.Data
10−
11−data Module = Module [String] Exports Imports [Statement]
12− deriving (Show)
13−
14−type Exports = [String]
15−
16−type Imports = [(String, ImportMethod)]
17−data ImportMethod = As String | Importing [String] | Hiding [String]
18− deriving (Eq, Ord, Show, Data, Typeable)
19−
20−
21−data Pattern = PData String [Pattern]
22− | PRecord [String]
23− | PAsVar String Pattern
24− | PVar String
25− | PAnything
26− deriving (Eq, Data, Typeable)
27−
28−type CExpr = Located Expr
29−data Expr = IntNum Int
30− | FloatNum Float
31− | Chr Char
32− | Str String
33− | Boolean Bool
34− | Range CExpr CExpr
35− | Access CExpr String
36− | Remove CExpr String
37− | Insert CExpr String CExpr
38− | Modify CExpr [(String,CExpr)]
39− | Record [(String,[String],CExpr)]
40− | Binop String CExpr CExpr
41− | Lambda String CExpr
42− | App CExpr CExpr
43− | MultiIf [(CExpr,CExpr)]
44− | Let [Def] CExpr
45− | Var String
46− | Case CExpr [(Pattern,CExpr)]
47− | Data String [CExpr]
48− | Markdown Pandoc.Pandoc
49− deriving (Eq, Data, Typeable)
50−
51−data Def = FnDef String [String] CExpr
52− | OpDef String String String CExpr
53− | TypeAnnotation String Type
54− deriving (Eq, Data, Typeable)
55−
56−data Statement = Definition Def
57− | Datatype String [X] [(String,[Type])]
58− | TypeAlias String [X] Type
59− | ImportEvent String CExpr String Type
60− | ExportEvent String String Type
61− deriving (Eq, Show, Data, Typeable)
62−
63−cons h t = epos h t (Data "Cons" [h,t])
64−nil = L (Just "[]") NoSpan (Data "Nil" [])
65−list = foldr cons nil
66−tuple es = Data ("Tuple" ++ show (length es)) es
67−
68−delist (L _ _ (Data "Cons" [h,t])) = h : delist t
69−delist _ = []
70−
71−
72−pcons h t = PData "Cons" [h,t]
73−pnil = PData "Nil" []
74−plist = foldr pcons pnil
75−ptuple es = PData ("Tuple" ++ show (length es)) es
76−
77−brkt s = "{ " ++ s ++ " }"
78−parensIf b s = if b then parens s else s
79−isOp c = isSymbol c || elem c "+-/*=.$<>:&|^?%#@~!"
80−
81−instance Show Pattern where
82− show p =
83− case p of
84− PRecord fs -> brkt (intercalate ", " fs)
85− PVar x -> x
86− PAsVar x p -> show p ++ " as " ++ x
87− PAnything -> "_"
88− PData "Cons" [hd@(PData "Cons" _),tl] ->
89− parens (show hd) ++ " :: " ++ show tl
90− PData "Cons" [hd,tl] -> show hd ++ " : " ++ show tl
91− PData "Nil" [] -> "[]"
92− PData name ps ->
93− if take 5 name == "Tuple" && all isDigit (drop 5 name) then
94− parens . intercalate ", " $ map show ps
95− else parensIf (not (null ps)) $ unwords (name : map show ps)
96−
97−instance Show Expr where
98− show e =
99− let show' (L _ _ e) = parensIf (needsParens e) (show e) in
100− case e of
101− IntNum n -> show n
102− FloatNum n -> show n
103− Chr c -> show c
104− Str s -> show s
105− Boolean b -> show b
106− Range e1 e2 -> "[" ++ show e1 ++ ".." ++ show e2 ++ "]"
107− Access e x -> show' e ++ "." ++ x
108− Remove e x -> brkt (show e ++ " - " ++ x)
109− Insert (L _ _ (Remove e y)) x v ->
110− brkt (show e ++ " - " ++ y ++ " | " ++ x ++ " = " ++ show v)
111− Insert e x v -> brkt (show e ++ " | " ++ x ++ " = " ++ show v)
112− Modify e fs -> brkt (show e ++" | "++ intercalate ", " (map field fs))
113− where field (x,e) = x ++ " <- " ++ show e
114− Record r -> brkt (intercalate ", " (map fields r))
115− where fields (f,args,e) = f ++ concatMap (' ':) args ++ " = " ++ show e
116− Binop op e1 e2 -> show' e1 ++ " " ++ op ++ " " ++ show' e2
117− Lambda x e -> let (xs,e') = getLambdas (notLocated $ Lambda x e) in
118− concat [ "\\", intercalate " " xs, " -> ", show e' ]
119− App e1 e2 -> show' e1 ++ " " ++ show' e2
120− MultiIf (p:ps) -> concat [ "if | ", iff p, sep (map iff ps) ]
121− where iff (b,e) = show b ++ " -> " ++ show e
122− sep = concatMap ("\n | " ++)
123− Let defs e -> "let { "++intercalate " ; " (map show defs)++" } in "++show e
124− Var (c:cs) -> if isOp c then parens (c:cs) else c:cs
125− Case e pats -> "case "++ show e ++" of " ++ brkt (intercalate " ; " pats')
126− where pats' = map (\(p,e) -> show p ++ " -> " ++ show e) pats
127− Data name es
128− | name == "Cons" -> ("["++) . (++"]") . intercalate "," . map show $
129− delist (notLocated $ Data "Cons" es)
130− | name == "Nil" -> "[]"
131− | otherwise -> name ++ " " ++ intercalate " " (map show' es)
132− Markdown _ -> "[markdown| ... |]"
133−
134−
135−instance Show Def where
136− show e =
137− case e of
138− FnDef v [] e -> v ++ " = " ++ show e
139− FnDef f args e -> f ++ concatMap (' ':) args ++ " = " ++ show e
140− OpDef op a1 a2 e -> intercalate " " [a1,op,a2] ++ " = " ++ show e
141− TypeAnnotation n t -> n ++ " : " ++ show t
142−
143−getLambdas (L _ _ (Lambda x e)) = (x:xs,e')
144− where (xs,e') = getLambdas e
145−getLambdas e = ([],e)
146−
147−needsParens e =
148− case e of
149− Binop _ _ _ -> True
150− Lambda _ _ -> True
151− App _ _ -> True
152− MultiIf _ -> True
153− Let _ _ -> True
154− Case _ _ -> True
155− Data name (x:xs) -> name /= "Cons"
156− _ -> False
compiler/Parse/Binops.hs+14−18
@@ -1,18 +1,14 @@
1module Parse.Binops (binops, infixStmt, OpTable) where
1module Parse.Binops (binops, infixStmt, OpTable) where
2
2
3−import Ast
4−import Control.Monad (liftM,guard)
5import Control.Monad.Error
3import Control.Monad.Error
6−import Data.List (foldl',splitAt,elemIndices
4+import Data.List (intercalate)
7− ,group,groupBy,sortBy,find,intercalate)
8import qualified Data.Map as Map
5import qualified Data.Map as Map
9−import Data.Maybe (mapMaybe)
10
6
11−import Located (epos)
7+import SourceSyntax.Location (merge)
8+import SourceSyntax.Expression (LExpr, Expr(Binop))
9+import SourceSyntax.Declaration (Assoc(..))
12import Text.Parsec
10import Text.Parsec
13−import Parse.Library
11+import Parse.Helpers
14−
15−data Assoc = L | N | R deriving (Eq,Show)
16
12
17type OpTable = [(Int, Assoc, String)]
13type OpTable = [(Int, Assoc, String)]
18
14
@@ -39,10 +35,10 @@ opAssoc :: OpTable -> String -> Assoc
39opAssoc table op = Map.findWithDefault R op dict
35opAssoc table op = Map.findWithDefault R op dict
40 where dict = Map.fromList (map (\(_,assoc,op) -> (op,assoc)) table)
36 where dict = Map.fromList (map (\(_,assoc,op) -> (op,assoc)) table)
41
37
42−hasLevel :: OpTable -> Int -> (String,CExpr) -> Bool
38+hasLevel :: OpTable -> Int -> (String,LExpr) -> Bool
43hasLevel table n (op,_) = opLevel table op == n
39hasLevel table n (op,_) = opLevel table op == n
44
40
45−binops :: OpTable -> IParser CExpr -> IParser String -> IParser CExpr
41+binops :: OpTable -> IParser LExpr -> IParser String -> IParser LExpr
46binops table term anyOp =
42binops table term anyOp =
47 do e <- term
43 do e <- term
48 split (table ++ preludeTable) 0 e =<< many nextOp
44 split (table ++ preludeTable) 0 e =<< many nextOp
@@ -52,7 +48,7 @@ binops table term anyOp =
52 whitespace ; e <- term
48 whitespace ; e <- term
53 return (op,e)
49 return (op,e)
54
50
55−split :: OpTable -> Int -> CExpr -> [(String, CExpr)] -> IParser CExpr
51+split :: OpTable -> Int -> LExpr -> [(String, LExpr)] -> IParser LExpr
56split _ _ e [] = return e
52split _ _ e [] = return e
57split table n e eops = do
53split table n e eops = do
58 assoc <- getAssoc table n eops
54 assoc <- getAssoc table n eops
@@ -61,25 +57,25 @@ split table n e eops = do
61 case assoc of R -> joinR es ops
57 case assoc of R -> joinR es ops
62 _ -> joinL es ops
58 _ -> joinL es ops
63
59
64−splitLevel :: OpTable -> Int -> CExpr -> [(String, CExpr)] -> [IParser CExpr]
60+splitLevel :: OpTable -> Int -> LExpr -> [(String, LExpr)] -> [IParser LExpr]
65splitLevel table n e eops =
61splitLevel table n e eops =
66 case break (hasLevel table n) eops of
62 case break (hasLevel table n) eops of
67 (lops, (op,e'):rops) ->
63 (lops, (op,e'):rops) ->
68 split table (n+1) e lops : splitLevel table n e' rops
64 split table (n+1) e lops : splitLevel table n e' rops
69 (lops, []) -> [ split table (n+1) e lops ]
65 (lops, []) -> [ split table (n+1) e lops ]
70
66
71−joinL :: [CExpr] -> [String] -> IParser CExpr
67+joinL :: [LExpr] -> [String] -> IParser LExpr
72joinL [e] [] = return e
68joinL [e] [] = return e
73−joinL (a:b:es) (op:ops) = joinL (epos a b (Binop op a b) : es) ops
69+joinL (a:b:es) (op:ops) = joinL (merge a b (Binop op a b) : es) ops
74joinL _ _ = fail "Ill-formed binary expression. Report a compiler bug."
70joinL _ _ = fail "Ill-formed binary expression. Report a compiler bug."
75
71
76−joinR :: [CExpr] -> [String] -> IParser CExpr
72+joinR :: [LExpr] -> [String] -> IParser LExpr
77joinR [e] [] = return e
73joinR [e] [] = return e
78joinR (a:b:es) (op:ops) = do e <- joinR (b:es) ops
74joinR (a:b:es) (op:ops) = do e <- joinR (b:es) ops
79− return (epos a e (Binop op a e))
75+ return (merge a e (Binop op a e))
80joinR _ _ = fail "Ill-formed binary expression. Report a compiler bug."
76joinR _ _ = fail "Ill-formed binary expression. Report a compiler bug."
81
77
82−getAssoc :: OpTable -> Int -> [(String,CExpr)] -> IParser Assoc
78+getAssoc :: OpTable -> Int -> [(String,LExpr)] -> IParser Assoc
83getAssoc table n eops
79getAssoc table n eops
84 | all (==L) assocs = return L
80 | all (==L) assocs = return L
85 | all (==R) assocs = return R
81 | all (==R) assocs = return R
compiler/Parse/Expr.hs+9−8
@@ -1,7 +1,5 @@
1module Parse.Expr (def,term) where
1module Parse.Expr (def,term) where
2
2
3−import Ast
4−import Located
5import Control.Applicative ((<$>), (<*>))
3import Control.Applicative ((<$>), (<*>))
6import Control.Monad
4import Control.Monad
7import Data.Char (isSymbol, isDigit)
5import Data.Char (isSymbol, isDigit)
@@ -15,6 +13,9 @@ import Parse.Patterns
15import Parse.Binops
13import Parse.Binops
16import Parse.Types
14import Parse.Types
17
15
16+import Ast
17+import Located
18+
18import Guid
19import Guid
19import Types.Types (Type (VarT), Scheme (Forall))
20import Types.Types (Type (VarT), Scheme (Forall))
20
21
@@ -70,7 +71,7 @@ listTerm =
70 return e
71 return e
71 ])
72 ])
72
73
73−parensTerm :: IParser CExpr
74+parensTerm :: IParser LExpr
74parensTerm = parens $ choice
75parensTerm = parens $ choice
75 [ do start <- getPosition
76 [ do start <- getPosition
76 op <- try anyOp
77 op <- try anyOp
@@ -93,7 +94,7 @@ parensTerm = parens $ choice
93 _ -> pos start end (tuple es)
94 _ -> pos start end (tuple es)
94 ]
95 ]
95
96
96−recordTerm :: IParser CExpr
97+recordTerm :: IParser LExpr
97recordTerm = brackets $ choice [ misc, addLocation record ]
98recordTerm = brackets $ choice [ misc, addLocation record ]
98 where field = do
99 where field = do
99 fDefs <- (:) <$> (PVar <$> rLabel) <*> spacePrefix patternTerm
100 fDefs <- (:) <$> (PVar <$> rLabel) <*> spacePrefix patternTerm
@@ -125,14 +126,14 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
125 Nothing -> try (insert record) <|> try (modify record)
126 Nothing -> try (insert record) <|> try (modify record)
126
127
127
128
128−term :: IParser CExpr
129+term :: IParser LExpr
129term = addLocation (choice [ numTerm, strTerm, chrTerm, listTerm, accessor ])
130term = addLocation (choice [ numTerm, strTerm, chrTerm, listTerm, accessor ])
130 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
131 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
131 <?> "basic term (4, x, 'c', etc.)"
132 <?> "basic term (4, x, 'c', etc.)"
132
133
133-------- Applications --------
134-------- Applications --------
134
135
135−appExpr :: IParser CExpr
136+appExpr :: IParser LExpr
136appExpr = do
137appExpr = do
137 tlist <- spaceSep1 term
138 tlist <- spaceSep1 term
138 return $ case tlist of
139 return $ case tlist of
@@ -141,7 +142,7 @@ appExpr = do
141
142
142-------- Normal Expressions --------
143-------- Normal Expressions --------
143
144
144−binaryExpr :: IParser CExpr
145+binaryExpr :: IParser LExpr
145binaryExpr = binops [] appExpr anyOp
146binaryExpr = binops [] appExpr anyOp
146
147
147ifExpr :: IParser Expr
148ifExpr :: IParser Expr
@@ -159,7 +160,7 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
159 b <- expr ; whitespace ; string "->" ; whitespace
160 b <- expr ; whitespace ; string "->" ; whitespace
160 (,) b <$> expr
161 (,) b <$> expr
161
162
162−lambdaExpr :: IParser CExpr
163+lambdaExpr :: IParser LExpr
163lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
164lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
164 whitespace
165 whitespace
165 pats <- spaceSep1 patternTerm
166 pats <- spaceSep1 patternTerm
compiler/Parse/Library.hs → compiler/Parse/Helpers.hsrenamed+9−9
@@ -1,13 +1,13 @@
1+module Parse.Helpers where
1
2
2−module Parse.Library where
3−
4−import Ast
5−import Located
6import Control.Applicative ((<$>),(<*>))
3import Control.Applicative ((<$>),(<*>))
7import Control.Monad
4import Control.Monad
8import Control.Monad.State
5import Control.Monad.State
9import Data.Char (isUpper)
6import Data.Char (isUpper)
7+import SourceSyntax.Helpers (isOp)
8+import SourceSyntax.Location as Location
9+import SourceSyntax.Expression
10−import Rename (deprime)
10+import SourceSyntax.Rename (deprime)
11import Text.Parsec hiding (newline,spaces,State)
11import Text.Parsec hiding (newline,spaces,State)
12import Text.Parsec.Indent
12import Text.Parsec.Indent
13
13
@@ -124,14 +124,14 @@ parens = surround '(' ')' "paren"
124brackets :: IParser a -> IParser a
124brackets :: IParser a -> IParser a
125brackets = surround '{' '}' "bracket"
125brackets = surround '{' '}' "bracket"
126
126
127−addLocation :: IParser Expr -> IParser CExpr
127+addLocation :: IParser Expr -> IParser LExpr
128addLocation expr = do
128addLocation expr = do
129 start <- getPosition
129 start <- getPosition
130 e <- expr
130 e <- expr
131 end <- getPosition
131 end <- getPosition
132− return (pos start end e)
132+ return (Location.at start end e)
133
133
134−accessible :: IParser CExpr -> IParser CExpr
134+accessible :: IParser LExpr -> IParser LExpr
135accessible expr = do
135accessible expr = do
136 start <- getPosition
136 start <- getPosition
137 ce@(L s t e) <- expr
137 ce@(L s t e) <- expr
@@ -143,7 +143,7 @@ accessible expr = do
143 Just _ -> accessible $ do
143 Just _ -> accessible $ do
144 v <- var <?> "field access (e.g. List.map)"
144 v <- var <?> "field access (e.g. List.map)"
145 end <- getPosition
145 end <- getPosition
146− return (pos start end (f v))
146+ return (Location.at start end (f v))
147 case e of Var (c:cs) | isUpper c -> rest (\v -> Var (c:cs ++ '.':v))
147 case e of Var (c:cs) | isUpper c -> rest (\v -> Var (c:cs ++ '.':v))
148 | otherwise -> rest (Access ce)
148 | otherwise -> rest (Access ce)
149 _ -> rest (Access ce)
149 _ -> rest (Access ce)
compiler/Parse/Patterns.hs+1−1
@@ -1,5 +1,5 @@
1
1
2−module Parse.Patterns (patternTerm, patternExpr, makeLambda, flattenPatterns) where
2+module Parse.Pattern (patternTerm, patternExpr, makeLambda, flattenPatterns) where
3
3
4import Ast
4import Ast
5import Located
5import Located
compiler/Parse/Types.hs+8−7
@@ -1,6 +1,5 @@
1module Parse.Types where
1module Parse.Types where
2
2
3−import Ast
4import Control.Applicative ((<$>),(<*>))
3import Control.Applicative ((<$>),(<*>))
5import Control.Monad (liftM,mapM)
4import Control.Monad (liftM,mapM)
6import Data.Char (isUpper,isLower)
5import Data.Char (isUpper,isLower)
@@ -9,8 +8,10 @@ import Data.List (lookup,intercalate)
9import Text.Parsec
8import Text.Parsec
10import Text.Parsec.Indent
9import Text.Parsec.Indent
11
10
12−import Located
11+import SourceSyntax.Location as Located
13−import Parse.Library
12+import SourceSyntax.Expression
13+import SourceSyntax.Declaration
14+import Parse.Helpers
14import Types.Types hiding (parens,string)
15import Types.Types hiding (parens,string)
15import Guid
16import Guid
16
17
@@ -69,7 +70,7 @@ typeConstructor :: IParser (String, [ParseType])
69typeConstructor = (,) <$> (capVar <?> "another type constructor")
70typeConstructor = (,) <$> (capVar <?> "another type constructor")
70 <*> spacePrefix (typeSimple <|> typeUnambiguous)
71 <*> spacePrefix (typeSimple <|> typeUnambiguous)
71
72
72−typeAlias :: IParser [Statement]
73+typeAlias :: IParser [Declaration]
73typeAlias = do
74typeAlias = do
74 start <- getPosition
75 start <- getPosition
75 reserved "type" <?> "type alias (type Point = {x:Int, y:Int})"
76 reserved "type" <?> "type alias (type Point = {x:Int, y:Int})"
@@ -91,13 +92,13 @@ typeAlias = do
91toConstructor start end alias Nothing kvs =
92toConstructor start end alias Nothing kvs =
92 Definition (FnDef alias args (loc (Record rec)))
93 Definition (FnDef alias args (loc (Record rec)))
93 where
94 where
94− loc = pos start end
95+ loc = Located.at start end
95 args = map fst kvs
96 args = map fst kvs
96 rec = map (\a -> (a, [], loc (Var a))) args
97 rec = map (\a -> (a, [], loc (Var a))) args
97toConstructor start end alias (Just _) kvs =
98toConstructor start end alias (Just _) kvs =
98 Definition (FnDef alias (args++["_ext_"]) (loc rec))
99 Definition (FnDef alias (args++["_ext_"]) (loc rec))
99 where
100 where
100− loc = pos start end
101+ loc = Located.at start end
101 args = map fst kvs
102 args = map fst kvs
102 rec = foldl insert (Var "_ext_") (zip args (map (loc . Var) args))
103 rec = foldl insert (Var "_ext_") (zip args (map (loc . Var) args))
103 insert e (k,v) = Insert (loc e) k v
104 insert e (k,v) = Insert (loc e) k v
@@ -107,7 +108,7 @@ typeAnnotation = TypeAnnotation <$> try start <*> (toType <$> typeExpr)
107 where start = do v <- lowVar <|> parens symOp
108 where start = do v <- lowVar <|> parens symOp
108 whitespace ; hasType ; whitespace ; return v
109 whitespace ; hasType ; whitespace ; return v
109
110
110−datatype :: IParser Statement
111+datatype :: IParser Declaration
111datatype = do
112datatype = do
112 reserved "data" <?> "datatype definition (data T = A | B | ...)"
113 reserved "data" <?> "datatype definition (data T = A | B | ...)"
113 forcedWS ; name <- capVar <?> "name of data-type" ; args <- spacePrefix lowVar
114 forcedWS ; name <- capVar <?> "name of data-type" ; args <- spacePrefix lowVar
compiler/SourceSyntax/Declaration.hs+4−1
@@ -11,5 +11,8 @@ data Declaration
11 | TypeAlias String [X] Type
11 | TypeAlias String [X] Type
12 | ImportEvent String Expr.LExpr String Type
12 | ImportEvent String Expr.LExpr String Type
13 | ExportEvent String String Type
13 | ExportEvent String String Type
14− | Fixity Int String
14+ | Fixity Assoc Int String
15 deriving (Eq, Show, Data, Typeable)
15 deriving (Eq, Show, Data, Typeable)
16+
17+data Assoc = L | N | R
18+ deriving (Eq, Show, Data, Typeable)
compiler/Transform/Rename.hs → compiler/SourceSyntax/Rename.hsrenamed+12−7
@@ -1,13 +1,16 @@
1{-# LANGUAGE GeneralizedNewtypeDeriving #-}
1{-# LANGUAGE GeneralizedNewtypeDeriving #-}
2−module Rename (renameModule, derename, deprime) where
2+module SourceSyntax.Rename (renameModule, derename, deprime) where
3
3
4−import Ast
5−import Located
6import Control.Arrow (first)
4import Control.Arrow (first)
7import Control.Monad (ap, liftM, foldM, mapM, Monad, zipWithM)
5import Control.Monad (ap, liftM, foldM, mapM, Monad, zipWithM)
8import Control.Monad.State (evalState, State, get, put)
6import Control.Monad.State (evalState, State, get, put)
9import Data.Char (isLower,isDigit)
7import Data.Char (isLower,isDigit)
10import Guid
8import Guid
9+import SourceSyntax.Location
10+import SourceSyntax.Pattern
11+import SourceSyntax.Expression
12+import SourceSyntax.Declaration hiding (Assoc(..))
13+import SourceSyntax.Module
11
14
12derename var
15derename var
13 | isDigit (last var) = reverse . tail . dropWhile isDigit $ reverse var
16 | isDigit (last var) = reverse . tail . dropWhile isDigit $ reverse var
@@ -33,7 +36,7 @@ instance Rename Def where
33 rename env (TypeAnnotation n t) = return (TypeAnnotation (env n) t)
36 rename env (TypeAnnotation n t) = return (TypeAnnotation (env n) t)
34
37
35
38
36−instance Rename Statement where
39+instance Rename Declaration where
37 rename env stmt =
40 rename env stmt =
38 case stmt of
41 case stmt of
39 Definition def -> Definition `liftM` rename env def
42 Definition def -> Definition `liftM` rename env def
@@ -126,10 +129,10 @@ patternExtend pattern env =
126 case pattern of
129 case pattern of
127 PAnything -> return (PAnything, env)
130 PAnything -> return (PAnything, env)
128 PVar x -> first PVar `liftM` extend env x
131 PVar x -> first PVar `liftM` extend env x
129− PAsVar x p -> do
132+ PAlias x p -> do
130 (x', env') <- extend env x
133 (x', env') <- extend env x
131 (p', env'') <- patternExtend p env'
134 (p', env'') <- patternExtend p env'
132− return (PAsVar x' p', env'')
135+ return (PAlias x' p', env'')
133 PData name ps ->
136 PData name ps ->
134 first (PData name . reverse) `liftM` foldM f ([], env) ps
137 first (PData name . reverse) `liftM` foldM f ([], env) ps
135 where f (rps,env') p = do (rp,env'') <- patternExtend p env'
138 where f (rps,env') p = do (rp,env'') <- patternExtend p env'
@@ -137,7 +140,9 @@ patternExtend pattern env =
137 PRecord fs ->
140 PRecord fs ->
138 return (pattern, foldr (\f e n -> if n == f then f else env n) env fs)
141 return (pattern, foldr (\f e n -> if n == f then f else env n) env fs)
139
142
140−patternRename :: (String -> String) -> (Pattern, CExpr) -> GuidCounter (Pattern, CExpr)
143+patternRename :: (String -> String)
144+ -> (Pattern, LExpr)
145+ -> GuidCounter (Pattern, LExpr)
141patternRename env (p,e) = do
146patternRename env (p,e) = do
142 (rp,env') <- patternExtend p env
147 (rp,env') <- patternExtend p env
143 re <- rename env' e
148 re <- rename env' e
compiler/Types/Solver.hs+13−8
@@ -14,6 +14,8 @@ import Types.Types
14import Types.Substitutions
14import Types.Substitutions
15import Types.Alias (dealias)
15import Types.Alias (dealias)
16
16
17+import System.IO.Unsafe
18+
17isSolved ss (L _ _ (t1 :=: t2)) = t1 == t2
19isSolved ss (L _ _ (t1 :=: t2)) = t1 == t2
18isSolved ss (L _ _ (x :<<: _)) = isJust (lookup x ss)
20isSolved ss (L _ _ (x :<<: _)) = isJust (lookup x ss)
19isSolved ss c = False
21isSolved ss c = False
@@ -21,12 +23,15 @@ isSolved ss c = False
21type Aliases = Map.Map String ([X],Type)
23type Aliases = Map.Map String ([X],Type)
22
24
23crush :: Aliases -> Scheme -> GuidCounter (Either String Scheme)
25crush :: Aliases -> Scheme -> GuidCounter (Either String Scheme)
24−crush aliases (Forall xs cs t) =
26+crush aliases forall@(Forall xs cs t) =
25 do subs <- solver aliases Map.empty cs
27 do subs <- solver aliases Map.empty cs
26 return $ do ss' <- subs
28 return $ do ss' <- subs
27 let ss = Map.toList ss'
29 let ss = Map.toList ss'
28 cs' = filter (not . isSolved ss) (subst ss cs)
30 cs' = filter (not . isSolved ss) (subst ss cs)
31+ f x = (unsafePerformIO $ do
32+ print forall >> putStrLn "-------"
33+ print x >> putStrLn "~~~~~~~") `seq` x
29− return $ Forall xs cs' (subst ss t)
34+ return . f $ Forall xs cs' (subst ss t)
30
35
31schemeSubHelp txt span x s t1 rltn t2 = do
36schemeSubHelp txt span x s t1 rltn t2 = do
32 (t1',cs1) <- sub t1
37 (t1',cs1) <- sub t1
@@ -36,11 +41,10 @@ schemeSubHelp txt span x s t1 rltn t2 = do
36 | otherwise = do (st, cs) <- concretize s
41 | otherwise = do (st, cs) <- concretize s
37 return (subst [(x,st)] t, cs)
42 return (subst [(x,st)] t, cs)
38
43
39−schemeSub aliases x s c =
44+schemeSub x s' c =
40− do s' <- crush aliases s
41− case s' of
45+ case s' of
42− Right s'' -> Right `liftM` schemeSub' x s'' c
46+ Right s'' -> Right `liftM` schemeSub' x s'' c
43− Left err -> return $ Left err
47+ Left err -> return $ Left err
44
48
45schemeSub' x s c@(L txt span constraint) =
49schemeSub' x s c@(L txt span constraint) =
46 case constraint of
50 case constraint of
@@ -170,7 +174,8 @@ solver aliases subs (L txt span c : cs) =
170
174
171 x :<<: s
175 x :<<: s
172 | any (occurs x) cs ->
176 | any (occurs x) cs ->
177+ do s' <- crush aliases s
173− do css <- mapM (schemeSub aliases x s) cs
178+ css <- mapM (schemeSub x s') cs
174 case lefts css of
179 case lefts css of
175 err : _ -> return $ Left err
180 err : _ -> return $ Left err
176 [] -> solv (concat (rights css))
181 [] -> solv (concat (rights css))
compiler/Types/Types.hs+1−1
@@ -1,7 +1,7 @@
1{-# LANGUAGE DeriveDataTypeable #-}
1{-# LANGUAGE DeriveDataTypeable #-}
2module Types.Types where
2module Types.Types where
3
3
4−import Located
4+import SourceSyntax.Location
5import Data.Char (isDigit)
5import Data.Char (isDigit)
6import Data.List (intercalate,isPrefixOf)
6import Data.List (intercalate,isPrefixOf)
7import qualified Data.Set as Set
7import qualified Data.Set as Set
compiler/Types/Unify.hs+4−2
@@ -19,7 +19,9 @@ unify hints modul@(Module _ _ _ stmts) = run $ do
19 case result of
19 case result of
20 Left err -> return (Left err)
20 Left err -> return (Left err)
21 Right (schemes, constraints) ->
21 Right (schemes, constraints) ->
22+ do subs <- unsafePerformIO (mapM print constraints) `seq`
22− do subs <- Solver.solver (Alias.get stmts) Map.empty constraints
23+ Solver.solver (Alias.get stmts) Map.empty constraints
23 let ss = either (const []) Map.toList subs
24 let ss = either (const []) Map.toList subs
24− unsafePerformIO (mapM print . map (second (Subst.subst ss)) $ concatMap Map.toList schemes) `seq` return subs
25+ -- unsafePerformIO (mapM print . map (second (Subst.subst ss)) $ concatMap Map.toList schemes) `seq`
26+ return subs
25
27