on master help sign in
Fix parsing of unary negation when it is the first thing in parentheses.
2b98863Evan Czaplicki
compiler/Parse/Expression.hs+26−21
@@ -62,27 +62,32 @@ listTerm =
62 ])
62 ])
63
63
64parensTerm :: IParser (LExpr t v)
64parensTerm :: IParser (LExpr t v)
65−parensTerm = parens $ choice
65+parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
66− [ do start <- getPosition
66+ where
67+ opFn = do
68+ start <- getPosition
67− op <- try anyOp
69+ op <- anyOp
68− end <- getPosition
70+ end <- getPosition
69− let loc = Location.at start end
71+ let loc = Location.at start end
70− return . loc . Lambda (PVar "x") . loc . Lambda (PVar "y") . loc $
72+ return . loc . Lambda (PVar "x") . loc . Lambda (PVar "y") . loc $
71− Binop op (loc $ Var "x") (loc $ Var "y")
73+ Binop op (loc $ Var "x") (loc $ Var "y")
74+
75+ tupleFn = do
72− , do start <- getPosition
76+ start <- getPosition
73− let comma = char ',' <?> "comma ','"
77+ let comma = char ',' <?> "comma ','"
74− commas <- comma >> many (whitespace >> comma)
78+ commas <- comma >> many (whitespace >> comma)
75− end <- getPosition
79+ end <- getPosition
76− let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
80+ let vars = map (('v':) . show) [ 0 .. length commas + 1 ]
77− loc = Location.at start end
81+ loc = Location.at start end
78− return $ foldr (\x e -> loc $ Lambda x e)
82+ return $ foldr (\x e -> loc $ Lambda x e)
79− (loc . tuple $ map (loc . Var) vars) (map PVar vars)
83+ (loc . tuple $ map (loc . Var) vars) (map PVar vars)
84+
85+ parened = do
80− , do start <- getPosition
86+ start <- getPosition
81− es <- commaSep expr
87+ es <- commaSep expr
82− end <- getPosition
88+ end <- getPosition
83− return $ case es of [e] -> e
89+ return $ case es of [e] -> e
84− _ -> Location.at start end (tuple es)
90+ _ -> Location.at start end (tuple es)
85− ]
86
91
87recordTerm :: IParser (LExpr t v)
92recordTerm :: IParser (LExpr t v)
88recordTerm = brackets $ choice [ misc, addLocation record ]
93recordTerm = brackets $ choice [ misc, addLocation record ]