@@ -79,7 +79,9 @@ parseCase = Case <$> (P.between (C.reserved "case") (C.indented *> C.reserved "o
79 <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
79 <*> (C.indented *> C.mark (P.many (C.same *> C.mark parseCaseAlternative)))
81parseCaseAlternative :: P.Parsec String ParseState (Binder, Value)
81parseCaseAlternative :: P.Parsec String ParseState (Binder, Value)
82−parseCaseAlternative = (,) <$> (parseGuardedBinder <* C.lexeme (P.string "->")) <*> parseValue
82+parseCaseAlternative = (,) <$> (parseGuardedBinder <* C.lexeme (P.string "->"))
84+ P.<?> "case alternative"
84parseIfThenElse :: P.Parsec String ParseState Value
86parseIfThenElse :: P.Parsec String ParseState Value
85parseIfThenElse = IfThenElse <$> (C.reserved "if" *> C.indented *> parseValue)
87parseIfThenElse = IfThenElse <$> (C.reserved "if" *> C.indented *> parseValue)
@@ -90,7 +92,7 @@ parseBlock :: P.Parsec String ParseState Value
90parseBlock = Block <$> (C.reserved "do" *> parseManyStatements)
92parseBlock = Block <$> (C.reserved "do" *> parseManyStatements)
92parseManyStatements :: P.Parsec String ParseState [Statement]
94parseManyStatements :: 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"
95parseValueAtom :: P.Parsec String ParseState Value
97parseValueAtom :: P.Parsec String ParseState Value
96parseValueAtom = C.indented *> P.choice (map P.try
98parseValueAtom = C.indented *> P.choice (map P.try
@@ -110,7 +112,9 @@ parseValueAtom = C.indented *> P.choice (map P.try
110parseValue :: P.Parsec String ParseState Value
112parseValue :: P.Parsec String ParseState Value
111parseValue = do
113parseValue = do
112 customOps <- fixities <$> P.getState
114 customOps <- fixities <$> P.getState
113− buildExpressionParser (operators customOps) . C.buildPostfixParser postfixTable2 $ indexersAndAccessors
115+ (buildExpressionParser (operators customOps)
116+ . C.buildPostfixParser postfixTable2
117+ $ indexersAndAccessors) P.<?> "expression"
115 indexersAndAccessors = C.buildPostfixParser postfixTable1 $ parseValueAtom
119 indexersAndAccessors = C.buildPostfixParser postfixTable1 $ parseValueAtom
116 postfixTable1 = [ Accessor <$> (C.indented *> C.dot *> C.indented *> C.identifier)
120 postfixTable1 = [ Accessor <$> (C.indented *> C.dot *> C.indented *> C.identifier)
@@ -124,7 +128,7 @@ parseValue = do
124 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "-") >> return (Unary Negate)
128 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "-") >> return (Unary Negate)
125 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "+") >> return id ]
129 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "+") >> return id ]
126 ] ++ customOperatorTable user ++
130 ] ++ 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 ]
128 , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "<=") >> return (Binary LessThanOrEqualTo)) AssocRight
132 , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "<=") >> return (Binary LessThanOrEqualTo)) AssocRight
129 , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp ">=") >> return (Binary GreaterThanOrEqualTo)) AssocRight ]
133 , Infix (C.lexeme (P.try $ C.indented *> C.reservedOp ">=") >> return (Binary GreaterThanOrEqualTo)) AssocRight ]
130 , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "<") >> return (Binary LessThan)) AssocRight
134 , [ Infix (C.lexeme (P.try $ C.indented *> C.reservedOp "<") >> return (Binary LessThan)) AssocRight
@@ -157,7 +161,7 @@ customOperatorTable fixities =
157 flip map levels (map (\(name, (a, _)) -> flip Infix (toAssoc a) $ do
161 flip map levels (map (\(name, (a, _)) -> flip Infix (toAssoc a) $ do
158 C.lexeme $ P.try $ do
162 C.lexeme $ P.try $ do
159 C.indented
163 C.indented
160− C.reservedOp name
164+ C.reservedOp name P.<?> "operator"
161 return $ \t1 t2 -> App (App (Var (Op name)) [t1]) [t2]))
165 return $ \t1 t2 -> App (App (Var (Op name)) [t1]) [t2]))
163toAssoc :: Associativity -> Assoc
167toAssoc :: Associativity -> Assoc
@@ -218,7 +222,7 @@ parseStatement = P.choice (map P.try
218 , parseFor
222 , parseFor
219 , parseForEach
223 , parseForEach
220 , parseIf
224 , parseIf
221− , parseReturn ])
225+ , parseReturn ]) P.<?> "statement"
223parseStringBinder :: P.Parsec String ParseState Binder
227parseStringBinder :: P.Parsec String ParseState Binder
224parseStringBinder = StringBinder <$> C.stringLiteral
228parseStringBinder = StringBinder <$> C.stringLiteral
@@ -271,7 +275,7 @@ parseBinder = P.choice (map P.try
271 , parseNullaryBinder
275 , parseNullaryBinder
272 , parseObjectBinder
276 , parseObjectBinder
273 , parseArrayBinder
277 , parseArrayBinder
274− , C.parens parseBinder ])
278+ , C.parens parseBinder ]) P.<?> "binder"
276parseGuardedBinder :: P.Parsec String ParseState Binder
280parseGuardedBinder :: P.Parsec String ParseState Binder
277parseGuardedBinder = flip ($) <$> parseBinder <*> P.option id (GuardedBinder <$> (C.indented *> C.lexeme (P.char '|') *> C.indented *> parseValue))
281parseGuardedBinder = flip ($) <$> parseBinder <*> P.option id (GuardedBinder <$> (C.indented *> C.lexeme (P.char '|') *> C.indented *> parseValue))