This commit is contained in:
Simon Michael 2007-01-28 21:23:02 +00:00
parent 8e7c714d28
commit 9e043db386

View File

@ -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,7 +259,6 @@ 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
@ -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