@@ -20,21 +20,21 @@ import SourceSyntax.Expression
21-------- Basic Terms --------
21-------- Basic Terms --------
23−varTerm :: IParser (Expr t v)
23+varTerm :: IParser ParseExpr
24varTerm = toVar <$> var <?> "variable"
24varTerm = toVar <$> var <?> "variable"
26−toVar :: String -> Expr t v
26+toVar :: String -> ParseExpr
27toVar v = case v of "True" -> Literal (Literal.Boolean True)
27toVar v = case v of "True" -> Literal (Literal.Boolean True)
28 "False" -> Literal (Literal.Boolean False)
28 "False" -> Literal (Literal.Boolean False)
29 _ -> Var v
29 _ -> Var v
31−accessor :: IParser (Expr t v)
31+accessor :: IParser ParseExpr
32accessor = do
32accessor = do
33 (start, lbl, end) <- located (try (string "." >> rLabel))
33 (start, lbl, end) <- located (try (string "." >> rLabel))
34 let loc e = Location.at start end e
34 let loc e = Location.at start end e
35 return (Lambda (PVar "_") (loc $ Access (loc $ Var "_") lbl))
35 return (Lambda (PVar "_") (loc $ Access (loc $ Var "_") lbl))
37−negative :: IParser (Expr t v)
37+negative :: IParser ParseExpr
38negative = do
38negative = do
39 (start, nTerm, end) <-
39 (start, nTerm, end) <-
40 located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
40 located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
@@ -44,7 +44,7 @@ negative = do
45-------- Complex Terms --------
45-------- Complex Terms --------
47−listTerm :: IParser (Expr t v)
47+listTerm :: IParser ParseExpr
48listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
48listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
50 range = do
50 range = do
@@ -67,7 +67,7 @@ listTerm = markdown' <|> braces (try range <|> ExplicitList <$> commaSep expr)
67 string "}}"
67 string "}}"
68 return (md ++ span uid (length exprs), exprs ++ [e])
68 return (md ++ span uid (length exprs), exprs ++ [e])
70−parensTerm :: IParser (LExpr t v)
70+parensTerm :: IParser LParseExpr
71parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
71parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
@@ -90,7 +90,7 @@ parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
91 _ -> Location.at start end (tuple es)
91 _ -> Location.at start end (tuple es)
93−recordTerm :: IParser (LExpr t v)
93+recordTerm :: IParser LParseExpr
94recordTerm = brackets $ choice [ misc, addLocation record ]
94recordTerm = brackets $ choice [ misc, addLocation record ]
95 where field = do
95 where field = do
96 label <- rLabel
96 label <- rLabel
@@ -123,14 +123,14 @@ recordTerm = brackets $ choice [ misc, addLocation record ]
123 Nothing -> try (insert record) <|> try (modify record)
123 Nothing -> try (insert record) <|> try (modify record)
126−term :: IParser (LExpr t v)
126+term :: IParser LParseExpr
127term = addLocation (choice [ Literal <$> literal, listTerm, accessor, negative ])
127term = addLocation (choice [ Literal <$> literal, listTerm, accessor, negative ])
128 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
128 <|> accessible (addLocation varTerm <|> parensTerm <|> recordTerm)
129 <?> "basic term (4, x, 'c', etc.)"
129 <?> "basic term (4, x, 'c', etc.)"
131-------- Applications --------
131-------- Applications --------
133−appExpr :: IParser (LExpr t v)
133+appExpr :: IParser LParseExpr
134appExpr = do
134appExpr = do
135 t <- term
135 t <- term
136 ts <- constrainedSpacePrefix term $ \str ->
136 ts <- constrainedSpacePrefix term $ \str ->
@@ -141,12 +141,12 @@ appExpr = do
142-------- Normal Expressions --------
142-------- Normal Expressions --------
144−binaryExpr :: IParser (LExpr t v)
144+binaryExpr :: IParser LParseExpr
145binaryExpr = binops appExpr lastExpr anyOp
145binaryExpr = binops appExpr lastExpr anyOp
146 where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
146 where lastExpr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
147 <|> lambdaExpr
147 <|> lambdaExpr
149−ifExpr :: IParser (Expr t v)
149+ifExpr :: IParser ParseExpr
150ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
150ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
152 normal = do
152 normal = do
@@ -162,7 +162,7 @@ ifExpr = reserved "if" >> whitespace >> (normal <|> multiIf)
162 b <- expr ; padded arrow
162 b <- expr ; padded arrow
163 (,) b <$> expr
163 (,) b <$> expr
165−lambdaExpr :: IParser (LExpr t v)
165+lambdaExpr :: IParser LParseExpr
166lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
166lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
167 whitespace
167 whitespace
168 args <- spaceSep1 Pattern.term
168 args <- spaceSep1 Pattern.term
@@ -170,17 +170,17 @@ lambdaExpr = do char '\\' <|> char '\x03BB' <?> "anonymous function"
170 body <- expr
170 body <- expr
171 return (makeFunction args body)
171 return (makeFunction args body)
173−defSet :: IParser [Def t v]
173+defSet :: IParser [ParseDef]
174defSet = block (do d <- def ; whitespace ; return d)
174defSet = block (do d <- def ; whitespace ; return d)
176−letExpr :: IParser (Expr t v)
176+letExpr :: IParser ParseExpr
177letExpr = do
177letExpr = do
178 reserved "let" ; whitespace
178 reserved "let" ; whitespace
179 defs <- defSet
179 defs <- defSet
180 padded (reserved "in")
180 padded (reserved "in")
181 Let defs <$> expr
181 Let defs <$> expr
183−caseExpr :: IParser (Expr t v)
183+caseExpr :: IParser ParseExpr
184caseExpr = do
184caseExpr = do
185 reserved "case"; e <- padded expr; reserved "of"; whitespace
185 reserved "case"; e <- padded expr; reserved "of"; whitespace
186 Case e <$> (with <|> without)
186 Case e <$> (with <|> without)
@@ -190,7 +190,7 @@ caseExpr = do
190 with = brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
190 with = brackets (semiSep1 (case_ <?> "cases { x -> ... }"))
191 without = block (do c <- case_ ; whitespace ; return c)
191 without = block (do c <- case_ ; whitespace ; return c)
193−expr :: IParser (LExpr t v)
193+expr :: IParser LParseExpr
194expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
194expr = addLocation (choice [ ifExpr, letExpr, caseExpr ])
195 <|> lambdaExpr
195 <|> lambdaExpr
196 <|> binaryExpr
196 <|> binaryExpr
@@ -216,18 +216,18 @@ defStart =
216 return $ if o == '`' then [ PVar $ takeWhile (/='`') p, p1, p2 ]
216 return $ if o == '`' then [ PVar $ takeWhile (/='`') p, p1, p2 ]
217 else [ PVar (o:p), p1, p2 ]
217 else [ PVar (o:p), p1, p2 ]
219−makeFunction :: [Pattern] -> LExpr t v -> LExpr t v
219+makeFunction :: [Pattern] -> LParseExpr -> LParseExpr
220makeFunction args body@(L s _) =
220makeFunction args body@(L s _) =
221 foldr (\arg body' -> L s $ Lambda arg body') body args
221 foldr (\arg body' -> L s $ Lambda arg body') body args
223−definition :: IParser (Def t v)
223+definition :: IParser ParseDef
224definition = withPos $ do
224definition = withPos $ do
225 (name:args) <- defStart
225 (name:args) <- defStart
226 padded equals
226 padded equals
227 body <- expr
227 body <- expr
228 return . Def name $ makeFunction args body
228 return . Def name $ makeFunction args body
230−typeAnnotation :: IParser (Def t v)
230+typeAnnotation :: IParser ParseDef
231typeAnnotation = TypeAnnotation <$> try start <*> Type.expr
231typeAnnotation = TypeAnnotation <$> try start <*> Type.expr
233 start = do
233 start = do
@@ -235,5 +235,5 @@ typeAnnotation = TypeAnnotation <$> try start <*> Type.expr
235 padded hasType
235 padded hasType
238−def :: IParser (Def t v)
238+def :: IParser ParseDef
239def = typeAnnotation <|> definition
239def = typeAnnotation <|> definition