@@ -79,7 +79,9 @@ parseCase = Case <$> (P.between (C.reserved "case") (C.indented *> C.reserved "o
7979 <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
8080
8181parseCaseAlternative :: P.Parsec String ParseState (Binder, Value)
82−parseCaseAlternative = (,) <$> (parseGuardedBinder <* C.lexeme (P.string "->")) <*> parseValue
82+parseCaseAlternative = (,) <$> (parseGuardedBinder <* C.lexeme (P.string "->"))
83+ <*> parseValue
84+ P.<?> "case alternative"
8385
8486parseIfThenElse :: P.Parsec String ParseState Value
8587parseIfThenElse = IfThenElse <$> (C.reserved "if" *> C.indented *> parseValue)
@@ -90,7 +92,7 @@ parseBlock :: P.Parsec String ParseState Value
9092parseBlock = Block <$> (C.reserved "do" *> parseManyStatements)
9193
9294parseManyStatements :: P.Parsec String ParseState [Statement]
93−parseManyStatements = C.indented *> (C.mark $ P.many $ C.same *> C.mark parseStatement)
95+parseManyStatements = C.indented *> (C.mark $ P.many $ C.same *> C.mark parseStatement) P.<?> "block"
9496
9597parseValueAtom :: P.Parsec String ParseState Value
9698parseValueAtom = C.indented *> P.choice (map P.try
@@ -110,7 +112,9 @@ parseValueAtom = C.indented *> P.choice (map P.try
110112parseValue :: P.Parsec String ParseState Value
111113parseValue = do
112114 customOps <- fixities <$> P.getState
113− buildExpressionParser (operators customOps) . C.buildPostfixParser postfixTable2 $ indexersAndAccessors
115+ (buildExpressionParser (operators customOps)
116+ . C.buildPostfixParser postfixTable2
117+ $ indexersAndAccessors) P.<?> "expression"
114118 where
115119 indexersAndAccessors = C.buildPostfixParser postfixTable1 $ parseValueAtom
116120 postfixTable1 = [ Accessor <$> (C.indented *> C.dot *> C.indented *> C.identifier)
@@ -124,7 +128,7 @@ parseValue = do
124128 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "-") >> return (Unary Negate)
125129 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "+") >> return id ]
126130 ] ++ customOperatorTable user ++
127− [ [ Infix (C.lexeme (P.try (C.indented *> C.parseIdentInfix) >>= \ident -> return $ \t1 t2 -> App (App (Var ident) [t1]) [t2])) AssocRight ]
131+ [ [ Infix (C.lexeme (P.try (C.indented *> C.parseIdentInfix P.<?> "operator") >>= \ident -> return $ \t1 t2 -> App (App (Var ident) [t1]) [t2])) AssocRight ]
128132 , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "<=") >> return (Binary LessThanOrEqualTo)) AssocRight
129133 , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp ">=") >> return (Binary GreaterThanOrEqualTo)) AssocRight ]
130134 , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "<") >> return (Binary LessThan)) AssocRight
@@ -157,7 +161,7 @@ customOperatorTable fixities =
157161 flip map levels (map (\(name, (a, _)) -> flip Infix (toAssoc a) $ do
158162 C.lexeme $ P.try $ do
159163 C.indented
160− C.reservedOp name
164+ C.reservedOp name P.<?> "operator"
161165 return $ \t1 t2 -> App (App (Var (Op name)) [t1]) [t2]))
162166
163167toAssoc :: Associativity -> Assoc
@@ -218,7 +222,7 @@ parseStatement = P.choice (map P.try
218222 , parseFor
219223 , parseForEach
220224 , parseIf
221− , parseReturn ])
225+ , parseReturn ]) P.<?> "statement"
222226
223227parseStringBinder :: P.Parsec String ParseState Binder
224228parseStringBinder = StringBinder <$> C.stringLiteral
@@ -271,7 +275,7 @@ parseBinder = P.choice (map P.try
271275 , parseNullaryBinder
272276 , parseObjectBinder
273277 , parseArrayBinder
274− , C.parens parseBinder ])
278+ , C.parens parseBinder ]) P.<?> "binder"
275279
276280parseGuardedBinder :: P.Parsec String ParseState Binder
277281parseGuardedBinder = flip ($) <$> parseBinder <*> P.option id (GuardedBinder <$> (C.indented *> C.lexeme (P.char '|') *> C.indented *> parseValue))