lib: reduce backtracking of various parsers

This commit is contained in:
Alex Chen 2018-06-20 19:45:11 -06:00
parent e3a755b5b1
commit ed0106b209

View File

@ -328,9 +328,13 @@ statusp =
]
codep :: TextParser m Text
codep = option "" $ try $ do
codep = option "" $ do
try $ do
skipSome spacenonewline
between (char '(') (char ')') $ takeWhileP Nothing (/= ')')
char '('
code <- takeWhileP Nothing $ \c -> c /= ')' && c /= '\n'
char ')' <?> "closing bracket ')' for transaction code"
pure code
descriptionp :: TextParser m Text
descriptionp = takeWhileP Nothing (not . semicolonOrNewline)
@ -652,9 +656,8 @@ simplecommoditysymbolp :: TextParser m CommoditySymbol
simplecommoditysymbolp = takeWhile1P Nothing (not . isNonsimpleCommodityChar)
priceamountp :: JournalParser m Price
priceamountp = option NoPrice $ try $ do
lift (skipMany spacenonewline)
char '@'
priceamountp = option NoPrice $ do
try $ lift (skipMany spacenonewline) *> char '@'
priceConstructor <- char '@' *> pure TotalPrice <|> pure UnitPrice
lift (skipMany spacenonewline)
@ -663,10 +666,12 @@ priceamountp = option NoPrice $ try $ do
pure $ priceConstructor priceAmount
partialbalanceassertionp :: JournalParser m BalanceAssertion
partialbalanceassertionp = optional $ try $ do
partialbalanceassertionp = optional $ do
sourcepos <- try $ do
lift (skipMany spacenonewline)
sourcepos <- genericSourcePos <$> lift getPosition
char '='
pure sourcepos
lift (skipMany spacenonewline)
a <- amountp -- XXX should restrict to a simple amount
return (a, sourcepos)
@ -683,7 +688,8 @@ partialbalanceassertionp = optional $ try $ do
-- http://ledger-cli.org/3.0/doc/ledger3.html#Fixing-Lot-Prices
fixedlotpricep :: JournalParser m (Maybe Amount)
fixedlotpricep = optional $ try $ do
fixedlotpricep = optional $ do
try $ do
lift (skipMany spacenonewline)
char '{'
lift (skipMany spacenonewline)