46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
{-# LANGUAGE FlexibleContexts #-}
 | 
						|
module Hledger.Utils.Parse where
 | 
						|
 | 
						|
import Data.Char
 | 
						|
import Data.List
 | 
						|
import Text.Parsec
 | 
						|
import Text.Printf
 | 
						|
 | 
						|
import Hledger.Utils.UTF8IOCompat (error')
 | 
						|
 | 
						|
-- | Backtracking choice, use this when alternatives share a prefix.
 | 
						|
-- Consumes no input if all choices fail.
 | 
						|
choice' :: Stream s m t => [ParsecT s u m a] -> ParsecT s u m a
 | 
						|
choice' = choice . map Text.Parsec.try
 | 
						|
 | 
						|
parsewith :: Parsec [Char] () a -> String -> Either ParseError a
 | 
						|
parsewith p = runParser p () ""
 | 
						|
 | 
						|
parseWithCtx :: Stream s m t => u -> ParsecT s u m a -> s -> m (Either ParseError a)
 | 
						|
parseWithCtx ctx p = runParserT p ctx ""
 | 
						|
 | 
						|
fromparse :: Either ParseError a -> a
 | 
						|
fromparse = either parseerror id
 | 
						|
 | 
						|
parseerror :: ParseError -> a
 | 
						|
parseerror e = error' $ showParseError e
 | 
						|
 | 
						|
showParseError :: ParseError -> String
 | 
						|
showParseError e = "parse error at " ++ show e
 | 
						|
 | 
						|
showDateParseError :: ParseError -> String
 | 
						|
showDateParseError e = printf "date parse error (%s)" (intercalate ", " $ tail $ lines $ show e)
 | 
						|
 | 
						|
nonspace :: (Stream [Char] m Char) => ParsecT [Char] st m Char
 | 
						|
nonspace = satisfy (not . isSpace)
 | 
						|
 | 
						|
spacenonewline :: (Stream [Char] m Char) => ParsecT [Char] st m Char
 | 
						|
spacenonewline = satisfy (`elem` " \v\f\t")
 | 
						|
 | 
						|
restofline :: (Stream [Char] m Char) => ParsecT [Char] st m String
 | 
						|
restofline = anyChar `manyTill` newline
 | 
						|
 | 
						|
eolof :: (Stream [Char] m Char) => ParsecT [Char] st m ()
 | 
						|
eolof = (newline >> return ()) <|> eof
 | 
						|
 |