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