on master help sign in
cosmetic: make it simpler to get locations for parses
03cf56dEvan Czaplicki
compiler/Parse/Expression.hs+9−17
@@ -32,17 +32,14 @@ toVar v = case v of "True" -> Literal (Literal.Boolean True)
32
32
33accessor :: IParser (Expr t v)
33accessor :: IParser (Expr t v)
34accessor = do
34accessor = do
35− start <- getPosition
36− lbl <- try (string "." >> rLabel)
35+ (start, lbl, end) <- located (try (string "." >> rLabel))
37− end <- getPosition
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))
40
38
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)
45− end <- getPosition
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)
48
45
@@ -77,29 +74,24 @@ parensTerm :: IParser (LExpr t v)
77parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
74parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
78 where
75 where
79 opFn = do
76 opFn = do
80− start <- getPosition
77+ (start, op, end) <- located anyOp
81− op <- anyOp
82− end <- getPosition
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")
86
81
87 tupleFn = do
82 tupleFn = do
88− start <- getPosition
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))
91− end <- getPosition
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)
96
89
97 parened = do
90 parened = do
98− start <- getPosition
99− es <- commaSep expr
91+ (start, es, end) <- located (commaSep expr)
100− end <- getPosition
101− return $ case es of [e] -> e
92+ return $ case es of
93+ [e] -> e
102− _ -> Location.at start end (tuple es)
94+ _ -> Location.at start end (tuple es)
103
95
104recordTerm :: IParser (LExpr t v)
96recordTerm :: IParser (LExpr t v)
105recordTerm = brackets $ choice [ misc, addLocation record ]
97recordTerm = brackets $ choice [ misc, addLocation record ]
compiler/Parse/Helpers.hs+9−3
@@ -9,6 +9,7 @@ import qualified Data.Map as Map
9import SourceSyntax.Helpers as Help
9import SourceSyntax.Helpers as Help
10import SourceSyntax.Location as Location
10import SourceSyntax.Location as Location
11import SourceSyntax.Expression
11import SourceSyntax.Expression
12+import SourceSyntax.PrettyPrint
12import SourceSyntax.Declaration (Assoc)
13import SourceSyntax.Declaration (Assoc)
13import Text.Parsec hiding (newline,spaces,State)
14import Text.Parsec hiding (newline,spaces,State)
14import Text.Parsec.Indent
15import Text.Parsec.Indent
@@ -165,12 +166,17 @@ parens = surround '(' ')' "paren"
165brackets :: IParser a -> IParser a
166brackets :: IParser a -> IParser a
166brackets = surround '{' '}' "bracket"
167brackets = surround '{' '}' "bracket"
167
168
168−addLocation :: IParser (Expr t v) -> IParser (LExpr t v)
169+addLocation :: (Pretty a) => IParser a -> IParser (Location.Located a)
169addLocation expr = do
170addLocation expr = do
171+ (start, e, end) <- located expr
172+ return (Location.at start end e)
173+
174+located :: IParser a -> IParser (SourcePos, a, SourcePos)
175+located p = do
170 start <- getPosition
176 start <- getPosition
171− e <- expr
177+ e <- p
172 end <- getPosition
178 end <- getPosition
173− return (Location.at start end e)
179+ return (start, e, end)
174
180
175accessible :: IParser (LExpr t v) -> IParser (LExpr t v)
181accessible :: IParser (LExpr t v) -> IParser (LExpr t v)
176accessible expr = do
182accessible expr = do