
Here's what I have in one file: -- | Parse the text of an event with the given parser @p@. parse :: (Monad m) => P.CharParser () a -> String -> Derive.DeriveT m a parse p text = do (val, rest) <- case P.parse (p_rest p) "" text of Left err -> Derive.throw $ "parse error on char " ++ show (P.sourceColumn (P.errorPos err)) ++ " of " ++ show text ++ ": " ++ Seq.replace "\n" "; " (show_error_msgs (Parsec.Error.errorMessages err)) Right val -> return val unless (null rest) $ Derive.warn $ "trailing junk: " ++ show rest return val -- Contrary to its documentation, showErrorMessages takes a set of strings -- for translation, which makes it hard to use. show_error_msgs = Parsec.Error.showErrorMessages "or" "unknown parse error" "expecting" "unexpected" "end of input" p_rest :: P.GenParser tok st t -> P.GenParser tok st (t, [tok]) p_rest p = do val <- p rest <- P.getInput return (val, rest) And this reminds me of something I was going to ask about: it would be nice to fix either the documentation for showErrorMessages or the implementation. Preferably the implementation, because I can't see the current implementation actually being useful for translation...