@@ -11,39 +11,41 @@ import Parse.Literal
11import qualified Parse.Pattern as Pattern
11import qualified Parse.Pattern as Pattern
12import qualified Parse.Type as Type
12import qualified Parse.Type as Type
14−import SourceSyntax.Annotation as Annotation
14+import AST.Annotation as Annotation
15−import qualified SourceSyntax.Pattern as P
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
16−import qualified SourceSyntax.Literal as L
19+import qualified AST.Variable as Var
17−import SourceSyntax.Expression
20-------- Basic Terms --------
22-------- Basic Terms --------
22−varTerm :: IParser ParseExpr'
24+varTerm :: IParser Source.Expr'
23varTerm = toVar <$> var <?> "variable"
25varTerm = toVar <$> var <?> "variable"
25−toVar :: String -> ParseExpr'
27+toVar :: String -> Source.Expr'
26toVar v = case v of "True" -> Literal (L.Boolean True)
28toVar v = case v of "True" -> Literal (L.Boolean True)
27 "False" -> Literal (L.Boolean False)
29 "False" -> Literal (L.Boolean False)
28 _ -> rawVar v
30 _ -> rawVar v
30−accessor :: IParser ParseExpr'
32+accessor :: IParser Source.Expr'
31accessor = do
33accessor = do
32 (start, lbl, end) <- located (try (string "." >> rLabel))
34 (start, lbl, end) <- located (try (string "." >> rLabel))
33 let loc e = Annotation.at start end e
35 let loc e = Annotation.at start end e
34 return (Lambda (P.Var "_") (loc $ Access (loc $ rawVar "_") lbl))
36 return (Lambda (P.Var "_") (loc $ Access (loc $ rawVar "_") lbl))
36−negative :: IParser ParseExpr'
38+negative :: IParser Source.Expr'
37negative = do
39negative = do
38 (start, nTerm, end) <-
40 (start, nTerm, end) <-
39 located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
41 located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
40 let loc e = Annotation.at start end e
42 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)
44-------- Complex Terms --------
46-------- Complex Terms --------
46−listTerm :: IParser ParseExpr'
48+listTerm :: IParser Source.Expr'
47listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
49listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
49 range = do
51 range = do
@@ -66,14 +68,14 @@ listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
66 string "}}"
68 string "}}"
67 return (span uid (length exprs), exprs ++ [e])
69 return (span uid (length exprs), exprs ++ [e])
69−parensTerm :: IParser ParseExpr
71+parensTerm :: IParser Source.Expr
70parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
72parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
73 (start, op, end) <- located anyOp
75 (start, op, end) <- located anyOp
74 let loc = Annotation.at start end
76 let loc = Annotation.at start end
75 return . loc . Lambda (P.Var "x") . loc . Lambda (P.Var "y") . loc $
77 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"))
78 tupleFn = do
80 tupleFn = do
79 let comma = char ',' <?> "comma ','"
81 let comma = char ',' <?> "comma ','"
@@ -89,7 +91,7 @@ parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
90 _ -> Annotation.at start end (tuple es)
92 _ -> Annotation.at start end (tuple es)
92−recordTerm :: IParser ParseExpr
94+recordTerm :: IParser Source.Expr
93recordTerm = brackets $ choice [ misc, addLocation record ]
95recordTerm = brackets $ choice [ misc, addLocation record ]
95 field = do
97 field = do
@@ -123,14 +125,14 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
123 Nothing -> try (insert record) <|> try (modify record)
125 Nothing -> try (insert record) <|> try (modify record)
126−term :: IParser ParseExpr
128+term :: IParser Source.Expr
127term = addLocation (choice [ Literal <$> literal, listTerm, accessor, negative ])
129term = addLocation (choice [ Literal <$> literal, listTerm, accessor, negative ])
128 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
130 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
129 <?> "basic term (4, x, 'c', etc.)"
131 <?> "basic term (4, x, 'c', etc.)"
131-------- Applications --------
133-------- Applications --------
133−appExpr :: IParser ParseExpr
135+appExpr :: IParser Source.Expr
134appExpr = do
136appExpr = do
135 t <- term
137 t <- term
136 ts <- constrainedSpacePrefix term $ \str ->
138 ts <- constrainedSpacePrefix term $ \str ->
@@ -141,12 +143,12 @@ appExpr = do
142-------- Normal Expressions --------
144-------- Normal Expressions --------
144−binaryExpr :: IParser ParseExpr
146+binaryExpr :: IParser Source.Expr
145binaryExpr = binops appExpr lastExpr anyOp
147binaryExpr = binops appExpr lastExpr anyOp
146 where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
148 where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
147 <|> lambdaExpr
149 <|> lambdaExpr
149−ifExpr :: IParser ParseExpr'
151+ifExpr :: IParser Source.Expr'
150ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
152ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
152 normal = do
154 normal = do
@@ -162,7 +164,7 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
162 b <- expr ; padded arrow
164 b <- expr ; padded arrow
163 (,) b <$> expr
165 (,) b <$> expr
165−lambdaExpr :: IParser ParseExpr
167+lambdaExpr :: IParser Source.Expr
166lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
168lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
167 whitespace
169 whitespace
168 args <- spaceSep1 Pattern.term
170 args <- spaceSep1 Pattern.term
@@ -170,17 +172,17 @@ lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
170 body <- expr
172 body <- expr
171 return (makeFunction args body)
173 return (makeFunction args body)
173−defSet :: IParser [ParseDef]
175+defSet :: IParser [Source.Def]
174defSet = block (do d <- def ; whitespace ; return d)
176defSet = block (do d <- def ; whitespace ; return d)
176−letExpr :: IParser ParseExpr'
178+letExpr :: IParser Source.Expr'
177letExpr = do
179letExpr = do
178 reserved "let" ; whitespace
180 reserved "let" ; whitespace
179 defs <- defSet
181 defs <- defSet
180 padded (reserved "in")
182 padded (reserved "in")
181 Let defs <$> expr
183 Let defs <$> expr
183−caseExpr :: IParser ParseExpr'
185+caseExpr :: IParser Source.Expr'
184caseExpr = do
186caseExpr = do
185 reserved "case"; e <- padded expr; reserved "of"; whitespace
187 reserved "case"; e <- padded expr; reserved "of"; whitespace
186 Case e <$> (with <|> without)
188 Case e <$> (with <|> without)
@@ -190,13 +192,13 @@ caseExpr = do
190 with = brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
192 with = brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
191 without = block (do c <- case_ ; whitespace ; return c)
193 without = block (do c <- case_ ; whitespace ; return c)
193−expr :: IParser ParseExpr
195+expr :: IParser Source.Expr
194expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
196expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
195 <|> lambdaExpr
197 <|> lambdaExpr
196 <|> binaryExpr
198 <|> binaryExpr
197 <?> "an expression"
199 <?> "an expression"
199−defStart :: IParser [P.Pattern]
201+defStart :: IParser [Pattern.RawPattern]
200defStart =
202defStart =
201 choice [ do p1 <- try Pattern.term
203 choice [ do p1 <- try Pattern.term
202 infics p1 <|> func p1
204 infics p1 <|> func p1
@@ -216,24 +218,24 @@ defStart =
216 return $ if o == '`' then [ P.Var $ takeWhile (/='`') p, p1, p2 ]
218 return $ if o == '`' then [ P.Var $ takeWhile (/='`') p, p1, p2 ]
217 else [ P.Var (o:p), p1, p2 ]
219 else [ P.Var (o:p), p1, p2 ]
219−makeFunction :: [P.Pattern] -> ParseExpr -> ParseExpr
221+makeFunction :: [Pattern.RawPattern] -> Source.Expr -> Source.Expr
220makeFunction args body@(A ann _) =
222makeFunction args body@(A ann _) =
221 foldr (\arg body' -> A ann $ Lambda arg body') body args
223 foldr (\arg body' -> A ann $ Lambda arg body') body args
223−definition :: IParser ParseDef
225+definition :: IParser Source.Def
224definition = withPos $ do
226definition = withPos $ do
225 (name:args) <- defStart
227 (name:args) <- defStart
226 padded equals
228 padded equals
227 body <- expr
229 body <- expr
228− return . Def name $ makeFunction args body
230+ return . Source.Definition name $ makeFunction args body
230−typeAnnotation :: IParser ParseDef
232+typeAnnotation :: IParser Source.Def
231−typeAnnotation = TypeAnnotation <$> try start <*> Type.expr
233+typeAnnotation = Source.TypeAnnotation <$> try start <*> Type.expr
233 start = do
235 start = do
234 v <- lowVar <|> parens symOp
236 v <- lowVar <|> parens symOp
235 padded hasType
237 padded hasType
238−def :: IParser ParseDef
240+def :: IParser Source.Def
239def = typeAnnotation <|> definition
241def = typeAnnotation <|> definition