cleanup
This commit is contained in:
parent
8e7c714d28
commit
9e043db386
29
hledger.hs
29
hledger.hs
@ -1,7 +1,7 @@
|
|||||||
-- hledger - ledger-like money management utilities
|
-- hledger - ledger-compatible money management utilities
|
||||||
-- GPLv3, (c) Simon Michael & contributors,
|
-- GPLv3, (c) Simon Michael & contributors,
|
||||||
-- ledger is at http://newartisans.com/ledger.html
|
-- ledger is at http://newartisans.com/ledger.html
|
||||||
-- here's the ledger 2.5 grammar:
|
-- here's the v2.5 grammar:
|
||||||
{-
|
{-
|
||||||
"The ledger file format is quite simple, but also very flexible. It supports
|
"The ledger file format is quite simple, but also very flexible. It supports
|
||||||
many options, though typically the user can ignore most of them. They are
|
many options, though typically the user can ignore most of them. They are
|
||||||
@ -245,7 +245,7 @@ type Account = String
|
|||||||
|
|
||||||
-- ledger file parsing
|
-- ledger file parsing
|
||||||
|
|
||||||
-- struggling.. easier with a token parser ?
|
-- set up token parsing, though we're not using it heavily yet
|
||||||
ledgerLanguageDef = LanguageDef {
|
ledgerLanguageDef = LanguageDef {
|
||||||
commentStart = ""
|
commentStart = ""
|
||||||
, commentEnd = ""
|
, commentEnd = ""
|
||||||
@ -259,8 +259,7 @@ ledgerLanguageDef = LanguageDef {
|
|||||||
, reservedNames = []
|
, reservedNames = []
|
||||||
, caseSensitive = False
|
, caseSensitive = False
|
||||||
}
|
}
|
||||||
|
lexer = P.makeTokenParser ledgerLanguageDef
|
||||||
lexer = P.makeTokenParser ledgerLanguageDef
|
|
||||||
whiteSpace = P.whiteSpace lexer
|
whiteSpace = P.whiteSpace lexer
|
||||||
lexeme = P.lexeme lexer
|
lexeme = P.lexeme lexer
|
||||||
symbol = P.symbol lexer
|
symbol = P.symbol lexer
|
||||||
@ -271,12 +270,10 @@ identifier = P.identifier lexer
|
|||||||
reserved = P.reserved lexer
|
reserved = P.reserved lexer
|
||||||
reservedOp = P.reservedOp lexer
|
reservedOp = P.reservedOp lexer
|
||||||
|
|
||||||
|
-- parsers
|
||||||
|
|
||||||
|
|
||||||
ledger = do
|
ledger = do
|
||||||
ledgernondatalines
|
ledgernondatalines
|
||||||
-- unlike ledger these must be first for now
|
-- for now these must come first, unlike ledger
|
||||||
modifier_entries <- many ledgermodifierentry
|
modifier_entries <- many ledgermodifierentry
|
||||||
periodic_entries <- many ledgerperiodicentry
|
periodic_entries <- many ledgerperiodicentry
|
||||||
--
|
--
|
||||||
@ -284,10 +281,10 @@ ledger = do
|
|||||||
eof
|
eof
|
||||||
return (Ledger modifier_entries periodic_entries entries)
|
return (Ledger modifier_entries periodic_entries entries)
|
||||||
|
|
||||||
whiteSpace1 = do space; whiteSpace
|
|
||||||
|
|
||||||
ledgernondatalines = many (ledgerdirective <|> ledgercomment <|> do {whiteSpace1; return []})
|
ledgernondatalines = many (ledgerdirective <|> ledgercomment <|> do {whiteSpace1; return []})
|
||||||
|
|
||||||
|
whiteSpace1 = do space; whiteSpace
|
||||||
|
|
||||||
restofline = anyChar `manyTill` newline
|
restofline = anyChar `manyTill` newline
|
||||||
|
|
||||||
ledgercomment = char ';' >> restofline <?> "comment"
|
ledgercomment = char ';' >> restofline <?> "comment"
|
||||||
@ -297,6 +294,7 @@ ledgerdirective = char '!' >> restofline <?> "directive"
|
|||||||
ledgertransactions = (ledgertransaction <?> "transaction") `manyTill` (newline <?> "blank line")
|
ledgertransactions = (ledgertransaction <?> "transaction") `manyTill` (newline <?> "blank line")
|
||||||
-- => unlike ledger, we need to end the file with a blank line
|
-- => unlike ledger, we need to end the file with a blank line
|
||||||
|
|
||||||
|
-- "automated entry"
|
||||||
ledgermodifierentry = do
|
ledgermodifierentry = do
|
||||||
char '=' <?> "entry"
|
char '=' <?> "entry"
|
||||||
valueexpr <- restofline
|
valueexpr <- restofline
|
||||||
@ -335,18 +333,16 @@ ledgertransaction = do
|
|||||||
many ledgercomment
|
many ledgercomment
|
||||||
return (Transaction account amount)
|
return (Transaction account amount)
|
||||||
|
|
||||||
--ledgeraccount = many1 (alphaNum <|> char ':')
|
-- account names may have single spaces in them, and are terminated by two or more spaces
|
||||||
ledgeraccount = many1 (alphaNum <|> char ':' <|> try (do {spacenonewline; do {notFollowedBy spacenonewline; return ' '}}))
|
ledgeraccount = many1 (alphaNum <|> char ':' <|> try (do {spacenonewline; do {notFollowedBy spacenonewline; return ' '}}))
|
||||||
|
|
||||||
--twoormorespaces = do spacenonewline; many1 spacenonewline
|
|
||||||
|
|
||||||
ledgeramount = try (do
|
ledgeramount = try (do
|
||||||
many1 spacenonewline --twoormorespaces
|
many1 spacenonewline
|
||||||
currency <- many (noneOf "-.0123456789\n") <?> "currency"
|
currency <- many (noneOf "-.0123456789\n") <?> "currency"
|
||||||
quantity <- many1 (oneOf "-.0123456789") <?> "quantity"
|
quantity <- many1 (oneOf "-.0123456789") <?> "quantity"
|
||||||
return (Amount currency (read quantity))
|
return (Amount currency (read quantity))
|
||||||
) <|>
|
) <|>
|
||||||
return (Amount "" 0) -- change later to balance the entry
|
return (Amount "" 0)
|
||||||
|
|
||||||
ledgereol = ledgercomment <|> do {newline; return []}
|
ledgereol = ledgercomment <|> do {newline; return []}
|
||||||
|
|
||||||
@ -374,7 +370,6 @@ main = do
|
|||||||
parseMyLedgerFile >>= showParseResult
|
parseMyLedgerFile >>= showParseResult
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
|
|
||||||
parseMyLedgerFile = do
|
parseMyLedgerFile = do
|
||||||
fname <- ledgerFilePath
|
fname <- ledgerFilePath
|
||||||
parsed <- parseFromFile ledger fname
|
parsed <- parseFromFile ledger fname
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user