@@ -11,39 +11,41 @@ import Parse.Literal
1111import qualified Parse.Pattern as Pattern
1212import qualified Parse.Type as Type
1313
14−import SourceSyntax.Annotation as Annotation
15−import qualified SourceSyntax.Pattern as P
16−import qualified SourceSyntax.Literal as L
17−import SourceSyntax.Expression
14+import AST.Annotation as Annotation
15+import AST.Expression.General
16+import qualified AST.Expression.Source as Source
17+import qualified AST.Literal as L
18+import qualified AST.Pattern as P
19+import qualified AST.Variable as Var
1820
1921
2022-------- Basic Terms --------
2123
22−varTerm :: IParser ParseExpr'
24+varTerm :: IParser Source.Expr'
2325varTerm = toVar <$> var <?> "variable"
2426
25−toVar :: String -> ParseExpr'
27+toVar :: String -> Source.Expr'
2628toVar v = case v of "True" -> Literal (L.Boolean True)
2729 "False" -> Literal (L.Boolean False)
2830 _ -> rawVar v
2931
30−accessor :: IParser ParseExpr'
32+accessor :: IParser Source.Expr'
3133accessor = do
3234 (start, lbl, end) <- located (try (string "." >> rLabel))
3335 let loc e = Annotation.at start end e
3436 return (Lambda (P.Var "_") (loc $ Access (loc $ rawVar "_") lbl))
3537
36−negative :: IParser ParseExpr'
38+negative :: IParser Source.Expr'
3739negative = do
3840 (start, nTerm, end) <-
3941 located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
4042 let loc e = Annotation.at start end e
41− return (Binop "-" (loc $ Literal (L.IntNum 0)) nTerm)
43+ return (Binop (Var.Raw "-") (loc $ Literal (L.IntNum 0)) nTerm)
4244
4345
4446-------- Complex Terms --------
4547
46−listTerm :: IParser ParseExpr'
48+listTerm :: IParser Source.Expr'
4749listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
4850 where
4951 range = do
@@ -66,14 +68,14 @@ listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
6668 string "}}"
6769 return (span uid (length exprs), exprs ++ [e])
6870
69−parensTerm :: IParser ParseExpr
71+parensTerm :: IParser Source.Expr
7072parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
7173 where
7274 opFn = do
7375 (start, op, end) <- located anyOp
7476 let loc = Annotation.at start end
7577 return . loc . Lambda (P.Var "x") . loc . Lambda (P.Var "y") . loc $
76− Binop op (loc $ rawVar "x") (loc $ rawVar "y")
78+ Binop (Var.Raw op) (loc (rawVar "x")) (loc (rawVar "y"))
7779
7880 tupleFn = do
7981 let comma = char ',' <?> "comma ','"
@@ -89,7 +91,7 @@ parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
8991 [e] -> e
9092 _ -> Annotation.at start end (tuple es)
9193
92−recordTerm :: IParser ParseExpr
94+recordTerm :: IParser Source.Expr
9395recordTerm = brackets $ choice [ misc, addLocation record ]
9496 where
9597 field = do
@@ -123,14 +125,14 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
123125 Nothing -> try (insert record) <|> try (modify record)
124126
125127
126−term :: IParser ParseExpr
128+term :: IParser Source.Expr
127129term = addLocation (choice [ Literal <$> literal, listTerm, accessor, negative ])
128130 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
129131 <?> "basic term (4, x, 'c', etc.)"
130132
131133-------- Applications --------
132134
133−appExpr :: IParser ParseExpr
135+appExpr :: IParser Source.Expr
134136appExpr = do
135137 t <- term
136138 ts <- constrainedSpacePrefix term $ \str ->
@@ -141,12 +143,12 @@ appExpr = do
141143
142144-------- Normal Expressions --------
143145
144−binaryExpr :: IParser ParseExpr
146+binaryExpr :: IParser Source.Expr
145147binaryExpr = binops appExpr lastExpr anyOp
146148 where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
147149 <|> lambdaExpr
148150
149−ifExpr :: IParser ParseExpr'
151+ifExpr :: IParser Source.Expr'
150152ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
151153 where
152154 normal = do
@@ -162,7 +164,7 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
162164 b <- expr ; padded arrow
163165 (,) b <$> expr
164166
165−lambdaExpr :: IParser ParseExpr
167+lambdaExpr :: IParser Source.Expr
166168lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
167169 whitespace
168170 args <- spaceSep1 Pattern.term
@@ -170,17 +172,17 @@ lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
170172 body <- expr
171173 return (makeFunction args body)
172174
173−defSet :: IParser [ParseDef]
175+defSet :: IParser [Source.Def]
174176defSet = block (do d <- def ; whitespace ; return d)
175177
176−letExpr :: IParser ParseExpr'
178+letExpr :: IParser Source.Expr'
177179letExpr = do
178180 reserved "let" ; whitespace
179181 defs <- defSet
180182 padded (reserved "in")
181183 Let defs <$> expr
182184
183−caseExpr :: IParser ParseExpr'
185+caseExpr :: IParser Source.Expr'
184186caseExpr = do
185187 reserved "case"; e <- padded expr; reserved "of"; whitespace
186188 Case e <$> (with <|> without)
@@ -190,13 +192,13 @@ caseExpr = do
190192 with = brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
191193 without = block (do c <- case_ ; whitespace ; return c)
192194
193−expr :: IParser ParseExpr
195+expr :: IParser Source.Expr
194196expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
195197 <|> lambdaExpr
196198 <|> binaryExpr
197199 <?> "an expression"
198200
199−defStart :: IParser [P.Pattern]
201+defStart :: IParser [Pattern.RawPattern]
200202defStart =
201203 choice [ do p1 <- try Pattern.term
202204 infics p1 <|> func p1
@@ -216,24 +218,24 @@ defStart =
216218 return $ if o == '`' then [ P.Var $ takeWhile (/='`') p, p1, p2 ]
217219 else [ P.Var (o:p), p1, p2 ]
218220
219−makeFunction :: [P.Pattern] -> ParseExpr -> ParseExpr
221+makeFunction :: [Pattern.RawPattern] -> Source.Expr -> Source.Expr
220222makeFunction args body@(A ann _) =
221223 foldr (\arg body' -> A ann $ Lambda arg body') body args
222224
223−definition :: IParser ParseDef
225+definition :: IParser Source.Def
224226definition = withPos $ do
225227 (name:args) <- defStart
226228 padded equals
227229 body <- expr
228− return . Def name $ makeFunction args body
230+ return . Source.Definition name $ makeFunction args body
229231
230−typeAnnotation :: IParser ParseDef
231−typeAnnotation = TypeAnnotation <$> try start <*> Type.expr
232+typeAnnotation :: IParser Source.Def
233+typeAnnotation = Source.TypeAnnotation <$> try start <*> Type.expr
232234 where
233235 start = do
234236 v <- lowVar <|> parens symOp
235237 padded hasType
236238 return v
237239
238−def :: IParser ParseDef
240+def :: IParser Source.Def
239241def = typeAnnotation <|> definition