@@ -32,17 +32,14 @@ toVar v = case v of "True" -> Literal (Literal.Boolean True)
3232
3333accessor :: IParser (Expr t v)
3434accessor = do
35− start <- getPosition
36− lbl <- try (string "." >> rLabel)
37− end <- getPosition
35+ (start, lbl, end) <- located (try (string "." >> rLabel))
3836 let loc e = Location.at start end e
3937 return (Lambda (PVar "_") (loc $ Access (loc $ Var "_") lbl))
4038
4139negative :: IParser (Expr t v)
4240negative = do
43− start <- getPosition
44− nTerm <- try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term
45− end <- getPosition
41+ (start, nTerm, end) <-
42+ located (try (char '-' >> notFollowedBy (char '.' <|> char '-')) >> term)
4643 let loc e = Location.at start end e
4744 return (Binop "-" (loc $ Literal (Literal.IntNum 0)) nTerm)
4845
@@ -77,29 +74,24 @@ parensTerm :: IParser (LExpr t v)
7774parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
7875 where
7976 opFn = do
80− start <- getPosition
81− op <- anyOp
82− end <- getPosition
77+ (start, op, end) <- located anyOp
8378 let loc = Location.at start end
8479 return . loc . Lambda (PVar "x") . loc . Lambda (PVar "y") . loc $
8580 Binop op (loc $ Var "x") (loc $ Var "y")
8681
8782 tupleFn = do
88− start <- getPosition
8983 let comma = char ',' <?> "comma ','"
90− commas <- comma >> many (whitespace >> comma)
91− end <- getPosition
84+ (start, commas, end) <- located (comma >> many (whitespace >> comma))
9285 let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
9386 loc = Location.at start end
9487 return $ foldr (\x e -> loc $ Lambda x e)
9588 (loc . tuple $ map (loc . Var) vars) (map PVar vars)
9689
9790 parened = do
98− start <- getPosition
99− es <- commaSep expr
100− end <- getPosition
101− return $ case es of [e] -> e
102− _ -> Location.at start end (tuple es)
91+ (start, es, end) <- located (commaSep expr)
92+ return $ case es of
93+ [e] -> e
94+ _ -> Location.at start end (tuple es)
10395
10496recordTerm :: IParser (LExpr t v)
10597recordTerm = brackets $ choice [ misc, addLocation record ]