@@ -32,17 +32,14 @@ toVar v = case v of "True" -> Literal (Literal.Boolean True)
33accessor :: IParser (Expr t v)
33accessor :: IParser (Expr t v)
34accessor = do
34accessor = do
36− lbl <- try (string "." >> rLabel)
35+ (start, lbl, end) <- located (try (string "." >> rLabel))
38 let loc e = Location.at start end e
36 let loc e = Location.at start end e
39 return (Lambda (PVar "_") (loc $ Access (loc $ Var "_") lbl))
37 return (Lambda (PVar "_") (loc $ Access (loc $ Var "_") lbl))
41negative :: IParser (Expr t v)
39negative :: IParser (Expr t v)
42negative = do
40negative = do
43− start <- getPosition
41+ (start, nTerm, end) <-
44− nTerm <- try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term
42+ located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
46 let loc e = Location.at start end e
43 let loc e = Location.at start end e
47 return (Binop "-" (loc $ Literal (Literal.IntNum 0)) nTerm)
44 return (Binop "-" (loc $ Literal (Literal.IntNum 0)) nTerm)
@@ -77,29 +74,24 @@ parensTerm :: IParser (LExpr t v)
77parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
74parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
80− start <- getPosition
77+ (start, op, end) <- located anyOp
83 let loc = Location.at start end
78 let loc = Location.at start end
84 return . loc . Lambda (PVar "x") . loc . Lambda (PVar "y") . loc $
79 return . loc . Lambda (PVar "x") . loc . Lambda (PVar "y") . loc $
85 Binop op (loc $ Var "x") (loc $ Var "y")
80 Binop op (loc $ Var "x") (loc $ Var "y")
87 tupleFn = do
82 tupleFn = do
89 let comma = char ',' <?> "comma ','"
83 let comma = char ',' <?> "comma ','"
90− commas <- comma >> many (whitespace >> comma)
84+ (start, commas, end) <- located (comma >> many (whitespace >> comma))
92 let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
85 let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
93 loc = Location.at start end
86 loc = Location.at start end
94 return $ foldr (\x e -> loc $ Lambda x e)
87 return $ foldr (\x e -> loc $ Lambda x e)
95 (loc . tuple $ map (loc . Var) vars) (map PVar vars)
88 (loc . tuple $ map (loc . Var) vars) (map PVar vars)
97 parened = do
90 parened = do
99− es <- commaSep expr
91+ (start, es, end) <- located (commaSep expr)
101− return $ case es of [e] -> e
92+ return $ case es of
102− _ -> Location.at start end (tuple es)
94+ _ -> Location.at start end (tuple es)
104recordTerm :: IParser (LExpr t v)
96recordTerm :: IParser (LExpr t v)
105recordTerm = brackets $ choice [ misc, addLocation record ]
97recordTerm = brackets $ choice [ misc, addLocation record ]