Double-entry bookkeeping language
Beancount is a double-entry bookkeeping language that includes optional account directives, multi-currency support, and built-in validation. Transactions use two or more posting legs with implicit balancing. See also: Journal entries as plain text, ABNF and Plain Text Accounting.
; @grammar "beancount" ; @word "identifier" ; @extras (@pattern("( |\\r|\\t)+")) ; @inline (currency_key_value) ; @externals (_stars / _sectionend / _eof) ; @supertypes (_entry / _directive) file = *((section / _declarations / _nl)) section = @field(headline) headline *((_declarations / _nl / @field(subsection) section)) _sectionend _number_expr = (number / _paren__number_expr / unary_number_expr / binary_number_expr) _paren__number_expr = %s"(" _number_expr %s")" unary_number_expr = @prec(3) (minus _number_expr / plus _number_expr) binary_number_expr = @prec(3) (@prec-left(1) _number_expr plus _number_expr / @prec-left(1) _number_expr minus _number_expr / @prec-left(2) _number_expr asterisk _number_expr / @prec-left(2) _number_expr slash _number_expr) transaction = @field(date) date @field(txn) txn [_txn_strings] @field(tags_links) [tags_links] @field(comment) [comment] _eol [1*((_indent _eol / _indent tags_links _eol / _key_value_line / posting / _indent @field(comment) comment _eol))] price_annotation = (incomplete_amount / currency) posting = _indent @field(optflag) [optflag] @field(account) account @field(amount) [incomplete_amount] @field(cost_spec) [cost_spec] [(at / atat) @field(price_annotation) [price_annotation]] @field(comment) [comment] _eol value = @prec-left(0) (string / date / currency / account / tag / bool / _none / _number_expr / amount / string / unquoted_string) key_value = (currency_key_value / @prec-left(0) key %s":" [*@pattern(" ") value]) _key_value_line = _indent key_value _eol _key_value_list = 1*((_indent _eol / _key_value_line / _indent @field(comment) comment _eol)) pushmeta = %s"pushmeta" key_value _eol open = @field(date) date %s"open" @field(account) account @field(currencies) *(currency *(%s"," currency)) @field(opt_booking) [opt_booking] @field(comment) [comment] _eol [_key_value_list] close = @field(date) date %s"close" @field(account) account @field(comment) [comment] _eol [_key_value_list] commodity = @field(date) date %s"commodity" @field(currency) currency @field(comment) [comment] _eol [_key_value_list] pad = @field(date) date %s"pad" @field(account) account @field(from_account) account @field(comment) [comment] _eol [_key_value_list] balance = @field(date) date %s"balance" @field(account) account @field(amount) amount_tolerance @field(comment) [comment] _eol [_key_value_list] amount = _number_expr currency amount_tolerance = (_number_expr currency / _number_expr %s"~" _number_expr currency) compound_amount = @field(per) [_number_expr] @field(currency) currency / @field(per) _number_expr @field(currency) [currency] / @field(per) [_number_expr] %s"#" @field(total) [_number_expr] @field(currency) currency incomplete_amount = _number_expr currency cost_spec = %s"{" @field(cost_comp_list) [_cost_comp_list] %s"}" / %s"{{" @field(cost_comp_list) [_cost_comp_list] %s"}}" _cost_comp_list = cost_comp *(%s"," cost_comp) cost_comp = (compound_amount / date / string / %s"*") price = @field(date) date %s"price" @field(currency) currency @field(amount) amount @field(comment) [comment] _eol [_key_value_list] event = @field(date) date %s"event" @field(type) string @field(desc) string @field(comment) [comment] _eol [_key_value_list] query = @field(date) date %s"query" @field(name) string @field(query) string @field(comment) [comment] _eol [_key_value_list] note = @field(date) date %s"note" @field(account) account @field(note) string @field(comment) [comment] _eol [_key_value_list] document = @field(date) date %s"document" @field(account) account @field(filename) filename @field(tags_links) [tags_links] @field(comment) [comment] _eol [_key_value_list] custom_value = (string / date / bool / amount / _number_expr / account) custom = @field(date) date %s"custom" @field(name) string @field(custom_value_list) [1*custom_value] @field(comment) [comment] _eol [_key_value_list] _entry = (transaction / balance / open / close / pad / document / note / event / price / commodity / query / custom) _directive = (pushtag / poptag / pushmeta / popmeta / option / include / plugin) _declarations = (_directive / _entry / _skipped_lines) currency_key_value = @prec-left(0) @alias(~key) %s"currency" %s":" [*@pattern(" ") @field(value) @alias(~value) value_currency] headline = _org_stars @token(@pattern("[ \\t]+")) [@field(item) item] _nl txn = (%s"txn" / flag / %s"*" / %s"#") _txn_strings = @field(payee) @alias(~payee) string @field(narration) @alias(~narration) string / @field(narration) @alias(~narration) string tags_links = 1*((link / tag)) optflag = (%s"*" / %s"#" / flag) value_currency = currency pushtag = %s"pushtag" tag _eol poptag = %s"poptag" tag _eol popmeta = %s"popmeta" key %s":" _eol opt_booking = string filename = string option = %s"option" @field(key) string @field(value) string _eol include = %s"include" string _eol plugin = (%s"plugin" string _eol / %s"plugin" string string _eol) _skipped_lines = (flag @pattern("[^\\r\\n]*") _eol / %s":" @pattern("[^\\r\\n]*") _eol / _eol / comment _eol) ; --- Tokens --- _nl = (%s"\n" / %s"\r") _eol = @token(@pattern("\\n")) _any = @pattern("[^\\r\\n]*") _org_stars = _stars @pattern("(\\*|#)+") item = @token(@pattern("[^\\r\\n]+")) _indent = @token(@pattern("[ \\r\\t]+")) atat = @token(%s"@@") at = @token(%s"@") asterisk = @token(%s"*") slash = @token(%s"/") plus = @token(%s"+") minus = @token(%s"-") flag = @token(@pattern("[!&?%PSTCURM*#]")) _none = @token(%s"NULL") bool = @token(@pattern("TRUE|FALSE")) date = @token(@pattern("([12]\\d{3}[-\\/](0[1-9]|1[0-2])[-\\/](0[1-9]|[12]\\d|3[01]))")) account = @token(@pattern("[A-Z][\\p{L}\\p{N}\\u3040-\\u309f\\u30a0-\\u30ff\\u4e00-\\u9fff\\uac00-\\ud7a3]*") *(%s":" @pattern("[\\p{Lu}\\p{N}\\u3040-\\u309f\\u30a0-\\u30ff\\u4e00-\\u9fff\\uac00-\\ud7a3][\\p{L}\\p{N}\\u3040-\\u309f\\u30a0-\\u30ff\\u4e00-\\u9fff\\uac00-\\ud7a3\\-]*"))) currency = @token(@pattern("[A-Z]([A-Z0-9\\'\\._\\-]{0,22}[A-Z0-9])?")) string = @token(@pattern("\"([^\"]|\\\\\")*\"")) unquoted_string = @token(@prec(-1) @pattern("[^\\r\\n]+")) number = @token(@pattern("([0-9]+|[0-9][0-9,]+[0-9])(\\.[0-9]*)?")) tag = @token(@pattern("#[A-Za-z0-9\\-_/.]+")) link = @token(@pattern("\\^[A-Za-z0-9\\-_/.]+")) key = @token(@pattern("[a-z][a-zA-Z0-9\\-_]+")) comment = @token(%s";" @pattern("[^\\r\\n]*")) identifier = @pattern("[a-zA-Z]+")
{
"name": "beancount",
"word": "identifier",
"rules": {
"file": {
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "section"
},
{
"type": "SYMBOL",
"name": "_declarations"
},
{
"type": "SYMBOL",
"name": "_nl"
}
]
}
},
"section": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "headline"
},
"name": "headline"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_declarations"
},
{
"type": "SYMBOL",
"name": "_nl"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "section"
},
"name": "subsection"
}
]
}
},
{
"type": "SYMBOL",
"name": "_sectionend"
}
]
},
"_number_expr": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "number"
},
{
"type": "SYMBOL",
"name": "_paren__number_expr"
},
{
"type": "SYMBOL",
"name": "unary_number_expr"
},
{
"type": "SYMBOL",
"name": "binary_number_expr"
}
]
},
"_paren__number_expr": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "STRING",
"value": ")"
}
]
},
"unary_number_expr": {
"type": "PREC",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "minus"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "plus"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
}
]
},
"value": 3
},
"binary_number_expr": {
"type": "PREC",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "PREC_LEFT",
"content": {
"type": "SYMBOL",
"name": "_number_expr"
},
"value": 1
},
{
"type": "SYMBOL",
"name": "plus"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "PREC_LEFT",
"content": {
"type": "SYMBOL",
"name": "_number_expr"
},
"value": 1
},
{
"type": "SYMBOL",
"name": "minus"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "PREC_LEFT",
"content": {
"type": "SYMBOL",
"name": "_number_expr"
},
"value": 2
},
{
"type": "SYMBOL",
"name": "asterisk"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "PREC_LEFT",
"content": {
"type": "SYMBOL",
"name": "_number_expr"
},
"value": 2
},
{
"type": "SYMBOL",
"name": "slash"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
}
]
},
"value": 3
},
"transaction": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "txn"
},
"name": "txn"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_txn_strings"
},
{
"type": "BLANK"
}
]
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "tags_links"
},
{
"type": "BLANK"
}
]
},
"name": "tags_links"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "SYMBOL",
"name": "tags_links"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SYMBOL",
"name": "_key_value_line"
},
{
"type": "SYMBOL",
"name": "posting"
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "comment"
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
}
]
}
},
{
"type": "BLANK"
}
]
}
]
},
"price_annotation": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "incomplete_amount"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
},
"posting": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "optflag"
},
{
"type": "BLANK"
}
]
},
"name": "optflag"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "account"
},
"name": "account"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "incomplete_amount"
},
{
"type": "BLANK"
}
]
},
"name": "amount"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "cost_spec"
},
{
"type": "BLANK"
}
]
},
"name": "cost_spec"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "at"
},
{
"type": "SYMBOL",
"name": "atat"
}
]
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "price_annotation"
},
{
"type": "BLANK"
}
]
},
"name": "price_annotation"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"value": {
"type": "PREC_LEFT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "date"
},
{
"type": "SYMBOL",
"name": "currency"
},
{
"type": "SYMBOL",
"name": "account"
},
{
"type": "SYMBOL",
"name": "tag"
},
{
"type": "SYMBOL",
"name": "bool"
},
{
"type": "SYMBOL",
"name": "_none"
},
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "amount"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "unquoted_string"
}
]
},
"value": 0
},
"key_value": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "currency_key_value"
},
{
"type": "SEQ",
"members": [
{
"type": "PREC_LEFT",
"content": {
"type": "SYMBOL",
"name": "key"
},
"value": 0
},
{
"type": "STRING",
"value": ":"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "@pattern"
}
},
{
"type": "STRING",
"value": " "
},
{
"type": "SYMBOL",
"name": "value"
}
]
},
{
"type": "BLANK"
}
]
}
]
}
]
},
"_key_value_line": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "SYMBOL",
"name": "key_value"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"_key_value_list": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SYMBOL",
"name": "_key_value_line"
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "comment"
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
}
]
}
},
"pushmeta": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "pushmeta"
},
{
"type": "SYMBOL",
"name": "key_value"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"open": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "open"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "account"
},
"name": "account"
},
{
"type": "FIELD",
"content": {
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "currency"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "currency"
}
]
}
}
]
}
},
"name": "currencies"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "opt_booking"
},
{
"type": "BLANK"
}
]
},
"name": "opt_booking"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"close": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "close"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "account"
},
"name": "account"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"commodity": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "commodity"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "currency"
},
"name": "currency"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"pad": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "pad"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "account"
},
"name": "account"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "account"
},
"name": "from_account"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"balance": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "balance"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "account"
},
"name": "account"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "amount_tolerance"
},
"name": "amount"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"amount": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
},
"amount_tolerance": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "STRING",
"value": "~"
},
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
}
]
},
"compound_amount": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "BLANK"
}
]
},
"name": "per"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "currency"
},
"name": "currency"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "_number_expr"
},
"name": "per"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "currency"
},
{
"type": "BLANK"
}
]
},
"name": "currency"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "BLANK"
}
]
},
"name": "per"
},
{
"type": "STRING",
"value": "#"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "BLANK"
}
]
},
"name": "total"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "currency"
},
"name": "currency"
}
]
}
]
},
"incomplete_amount": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
},
"cost_spec": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_cost_comp_list"
},
{
"type": "BLANK"
}
]
},
"name": "cost_comp_list"
},
{
"type": "STRING",
"value": "}"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{{"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_cost_comp_list"
},
{
"type": "BLANK"
}
]
},
"name": "cost_comp_list"
},
{
"type": "STRING",
"value": "}}"
}
]
}
]
},
"_cost_comp_list": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "cost_comp"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "cost_comp"
}
]
}
}
]
},
"cost_comp": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "compound_amount"
},
{
"type": "SYMBOL",
"name": "date"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "STRING",
"value": "*"
}
]
},
"price": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "price"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "currency"
},
"name": "currency"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "amount"
},
"name": "amount"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"event": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "event"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "string"
},
"name": "type"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "string"
},
"name": "desc"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"query": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "query"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "string"
},
"name": "name"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "string"
},
"name": "query"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"note": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "note"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "account"
},
"name": "account"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "string"
},
"name": "note"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"document": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "document"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "account"
},
"name": "account"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "filename"
},
"name": "filename"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "tags_links"
},
{
"type": "BLANK"
}
]
},
"name": "tags_links"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"custom_value": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "date"
},
{
"type": "SYMBOL",
"name": "bool"
},
{
"type": "SYMBOL",
"name": "amount"
},
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "account"
}
]
},
"custom": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "date"
},
"name": "date"
},
{
"type": "STRING",
"value": "custom"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "string"
},
"name": "name"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "custom_value"
}
},
{
"type": "BLANK"
}
]
},
"name": "custom_value_list"
},
{
"type": "FIELD",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
},
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"_entry": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "transaction"
},
{
"type": "SYMBOL",
"name": "balance"
},
{
"type": "SYMBOL",
"name": "open"
},
{
"type": "SYMBOL",
"name": "close"
},
{
"type": "SYMBOL",
"name": "pad"
},
{
"type": "SYMBOL",
"name": "document"
},
{
"type": "SYMBOL",
"name": "note"
},
{
"type": "SYMBOL",
"name": "event"
},
{
"type": "SYMBOL",
"name": "price"
},
{
"type": "SYMBOL",
"name": "commodity"
},
{
"type": "SYMBOL",
"name": "query"
},
{
"type": "SYMBOL",
"name": "custom"
}
]
},
"_directive": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "pushtag"
},
{
"type": "SYMBOL",
"name": "poptag"
},
{
"type": "SYMBOL",
"name": "pushmeta"
},
{
"type": "SYMBOL",
"name": "popmeta"
},
{
"type": "SYMBOL",
"name": "option"
},
{
"type": "SYMBOL",
"name": "include"
},
{
"type": "SYMBOL",
"name": "plugin"
}
]
},
"_declarations": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_directive"
},
{
"type": "SYMBOL",
"name": "_entry"
},
{
"type": "SYMBOL",
"name": "_skipped_lines"
}
]
},
"currency_key_value": {
"type": "SEQ",
"members": [
{
"type": "PREC_LEFT",
"content": {
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "currency"
},
"value": "key",
"named": true
},
"value": 0
},
{
"type": "STRING",
"value": ":"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "@pattern"
}
},
{
"type": "STRING",
"value": " "
},
{
"type": "FIELD",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "value_currency"
},
"value": "value",
"named": true
},
"name": "value"
}
]
},
{
"type": "BLANK"
}
]
}
]
},
"headline": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_org_stars"
},
{
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[ \\t]+"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "item"
},
"name": "item"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "_nl"
}
]
},
"txn": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "txn"
},
{
"type": "SYMBOL",
"name": "flag"
},
{
"type": "STRING",
"value": "*"
},
{
"type": "STRING",
"value": "#"
}
]
},
"_txn_strings": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "string"
},
"value": "payee",
"named": true
},
"name": "payee"
},
{
"type": "FIELD",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "string"
},
"value": "narration",
"named": true
},
"name": "narration"
}
]
},
{
"type": "FIELD",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "string"
},
"value": "narration",
"named": true
},
"name": "narration"
}
]
},
"tags_links": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "link"
},
{
"type": "SYMBOL",
"name": "tag"
}
]
}
},
"optflag": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "*"
},
{
"type": "STRING",
"value": "#"
},
{
"type": "SYMBOL",
"name": "flag"
}
]
},
"value_currency": {
"type": "SYMBOL",
"name": "currency"
},
"pushtag": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "pushtag"
},
{
"type": "SYMBOL",
"name": "tag"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"poptag": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "poptag"
},
{
"type": "SYMBOL",
"name": "tag"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"popmeta": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "popmeta"
},
{
"type": "SYMBOL",
"name": "key"
},
{
"type": "STRING",
"value": ":"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"opt_booking": {
"type": "SYMBOL",
"name": "string"
},
"filename": {
"type": "SYMBOL",
"name": "string"
},
"option": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "option"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "string"
},
"name": "key"
},
{
"type": "FIELD",
"content": {
"type": "SYMBOL",
"name": "string"
},
"name": "value"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"include": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "include"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"plugin": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "plugin"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "plugin"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
}
]
},
"_skipped_lines": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "flag"
},
{
"type": "PATTERN",
"value": "[^\\r\\n]*"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ":"
},
{
"type": "PATTERN",
"value": "[^\\r\\n]*"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
}
]
},
"_nl": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "\n"
},
{
"type": "STRING",
"value": "\r"
}
]
},
"_eol": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "\\n"
}
},
"_any": {
"type": "PATTERN",
"value": "[^\\r\\n]*"
},
"_org_stars": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_stars"
},
{
"type": "PATTERN",
"value": "(\\*|#)+"
}
]
},
"item": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[^\\r\\n]+"
}
},
"_indent": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[ \\r\\t]+"
}
},
"atat": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "@@"
}
},
"at": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "@"
}
},
"asterisk": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "*"
}
},
"slash": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "/"
}
},
"plus": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "+"
}
},
"minus": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "-"
}
},
"flag": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[!\u0026?%PSTCURM*#]"
}
},
"_none": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "NULL"
}
},
"bool": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "TRUE|FALSE"
}
},
"date": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "([12]\\d{3}[-\\/](0[1-9]|1[0-2])[-\\/](0[1-9]|[12]\\d|3[01]))"
}
},
"account": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "PATTERN",
"value": "[A-Z][\\p{L}\\p{N}\\u3040-\\u309f\\u30a0-\\u30ff\\u4e00-\\u9fff\\uac00-\\ud7a3]*"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ":"
},
{
"type": "PATTERN",
"value": "[\\p{Lu}\\p{N}\\u3040-\\u309f\\u30a0-\\u30ff\\u4e00-\\u9fff\\uac00-\\ud7a3][\\p{L}\\p{N}\\u3040-\\u309f\\u30a0-\\u30ff\\u4e00-\\u9fff\\uac00-\\ud7a3\\-]*"
}
]
}
}
]
}
},
"currency": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[A-Z]([A-Z0-9\\'\\._\\-]{0,22}[A-Z0-9])?"
}
},
"string": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "\"([^\"]|\\\\\")*\""
}
},
"unquoted_string": {
"type": "TOKEN",
"content": {
"type": "PREC",
"content": {
"type": "PATTERN",
"value": "[^\\r\\n]+"
},
"value": -1
}
},
"number": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "([0-9]+|[0-9][0-9,]+[0-9])(\\.[0-9]*)?"
}
},
"tag": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "#[A-Za-z0-9\\-_/.]+"
}
},
"link": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "\\^[A-Za-z0-9\\-_/.]+"
}
},
"key": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[a-z][a-zA-Z0-9\\-_]+"
}
},
"comment": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ";"
},
{
"type": "PATTERN",
"value": "[^\\r\\n]*"
}
]
}
},
"identifier": {
"type": "PATTERN",
"value": "[a-zA-Z]+"
}
},
"extras": [
{
"type": "PATTERN",
"value": "( |\\r|\\t)+"
}
],
"externals": [
{
"type": "SYMBOL",
"name": "_stars"
},
{
"type": "SYMBOL",
"name": "_sectionend"
},
{
"type": "SYMBOL",
"name": "_eof"
}
],
"inline": [
"currency_key_value"
],
"supertypes": [
"_entry",
"_directive"
]
}
module.exports = grammar({ /* * From beancount grammar.y */ name: "beancount", // Ensure we don't extract keywords from tokens word: ($) => $.identifier, inline: ($) => [ $.currency_key_value, ], conflicts: ($) => [ ], externals: ($) => [ $._stars, $._sectionend, $._eof, // Basically just '\0', but allows multiple to be matched ], extras: ($) => [ /( |\r|\t)+/, ], supertypes: $ => [ $._entry, $._directive, ], rules: { file: $ => repeat( choice( $.section, $._declarations, $._nl, ) ), _nl: _ => choice('\n', '\r'), _eol: $ => choice('\n', '\r', $._eof), _any: $ => /[^\r\n]*/, /*--------------------------------------------------------------------------------*/ /* SECTION AND HEADLINE RULES (Org-mode/Markdown support) */ /*--------------------------------------------------------------------------------*/ section: $ => seq( field('headline', $.headline), repeat(choice( $._declarations, $._nl, field('subsection', $.section) )), $._sectionend ), _org_stars: $ => seq($._stars, /(\*|#)+/), headline: $ => seq( $._org_stars, token(/[ \t]+/), // tokenized for performance optional(field('item', $.item)), $._nl, ), item: $ => token(/[^\r\n]+/), /*--------------------------------------------------------------------------------*/ /* TERMINAL SYMBOLS */ /*--------------------------------------------------------------------------------*/ _indent: $ => token(/[ \r\t]+/), _eol: $ => token(/\n/), atat: $ => token('@@'), at: $ => token('@'), asterisk: $ => token('*'), slash: $ => token('/'), plus: $ => token('+'), minus: $ => token('-'), flag: $ => token(/[!&?%PSTCURM*#]/), _none: $ => token('NULL'), bool: $ => token(/TRUE|FALSE/), date: $ => token(/([12]\d{3}[-\/](0[1-9]|1[0-2])[-\/](0[1-9]|[12]\d|3[01]))/), // Account names: Assets|Liabilities|Equity|Income|Expenses followed by colon-separated components // Components can contain Unicode letters/numbers including CJK characters // account: $ => $.identifier, // token(/[^\s\\ \n\r]/), account: $ => token( seq( /[A-Z][\p{L}\p{N}\u3040-\u309f\u30a0-\u30ff\u4e00-\u9fff\uac00-\ud7a3]*/, repeat( seq( ":", /[\p{Lu}\p{N}\u3040-\u309f\u30a0-\u30ff\u4e00-\u9fff\uac00-\ud7a3][\p{L}\p{N}\u3040-\u309f\u30a0-\u30ff\u4e00-\u9fff\uac00-\ud7a3\-]*/, ), ), ), ), currency: $ => token(/[A-Z]([A-Z0-9\'\._\-]{0,22}[A-Z0-9])?/), string: $ => token(/"([^"]|\\")*"/), unquoted_string: $ => token(prec(-1, /[^\r\n]+/)), number: $ => token(/([0-9]+|[0-9][0-9,]+[0-9])(\.[0-9]*)?/), tag: $ => token(/#[A-Za-z0-9\-_/.]+/), link: $ => token(/\^[A-Za-z0-9\-_/.]+/), /*--------------------------------------------------------------------------------*/ /* ARITHMETIC EXPRESSIONS */ /*--------------------------------------------------------------------------------*/ // Operator precedence: PLUS/MINUS (left, 1), MULTIPLY/DIVIDE (left, 2), UNARY (3) txn: $ => choice( "txn", $.flag, "*", "#" ), _number_expr: $ => choice( $.number, $._paren__number_expr, $.unary_number_expr, $.binary_number_expr, ), _paren__number_expr: $ => seq( "(", $._number_expr, ")", ), unary_number_expr: $ => prec(3, choice( seq( $.minus, $._number_expr, ), seq( $.plus, $._number_expr, ), ), ), binary_number_expr: $ => prec(3, choice( prec.left(1, seq($._number_expr, $.plus, $._number_expr), ), prec.left(1, seq($._number_expr, $.minus, $._number_expr), ), prec.left(2, seq($._number_expr, $.asterisk, $._number_expr), ), prec.left(2, seq($._number_expr, $.slash, $._number_expr), ), ), ), // OPTIONAL _txn_strings: $ => choice( seq( field("payee", alias($.string, $.payee)), field("narration", alias($.string, $.narration)), ), field("narration", alias($.string, $.narration)), ), // OPTIONAL tags_links: $ => repeat1( //seq( // optional($._indent), choice( $.link, $.tag, ), //), ), transaction: $ => seq( field("date", $.date), field("txn", $.txn), optional($._txn_strings), field("tags_links", optional($.tags_links)), field("comment", optional($.comment)), $._eol, optional( repeat1( choice( seq( $._indent, $._eol ), seq( $._indent, $.tags_links, $._eol ), $._key_value_line, $.posting, seq( $._indent, field("comment", $.comment), $._eol ) ) ), ), ), // OPTIONAL optflag: $ => choice( "*", "#", $.flag, ), price_annotation: $ => choice( $.incomplete_amount, $.currency ), posting: $ => seq( $._indent, field("optflag", optional($.optflag)), field("account", $.account), field("amount", optional($.incomplete_amount)), field("cost_spec", optional($.cost_spec)), optional( seq( choice($.at, $.atat), field("price_annotation", optional($.price_annotation)) ) ), field("comment", optional($.comment)), $._eol ), key: $ => token(/[a-z][a-zA-Z0-9\-_]+/), currency_key_value: $ => prec.left(seq( alias("currency", $.key), ":", optional( seq( repeat(/ /), field("value", alias($.value_currency, $.value)), ) ), )), value: $ => prec.left(choice( $.string, $.date, $.currency, $.account, $.tag, $.bool, $._none, $._number_expr, $.amount, $.string, $.unquoted_string, )), value_currency: $ => seq($.currency), key_value: $ => choice( $.currency_key_value, prec.left(seq( $.key, ":", optional( seq( repeat(/ /), $.value, ), ), )), ), _key_value_line: $ => seq( $._indent, /*prec.left(seq( $.key, ":", $.value, )),*/ $.key_value, $._eol ), // OPTIONAL _key_value_list: $ => repeat1( choice( seq( $._indent, $._eol ), seq( $._key_value_line ), seq( $._indent, field("comment", $.comment), $._eol ), ) ), // OPTIONAL pushtag: $ => seq( "pushtag", $.tag, $._eol ), poptag: $ => seq( "poptag", $.tag, $._eol ), pushmeta: $ => seq( "pushmeta", $.key_value, $._eol ), popmeta: $ => seq( "popmeta", $.key, ":", $._eol ), open: $ => seq( field("date", $.date), "open", field("account", $.account), field("currencies", repeat( seq( $.currency, repeat( seq( ",", $.currency ) ) ), )), field("opt_booking", optional($.opt_booking)), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), // OPTIONAL opt_booking: $ => $.string, close: $ => seq( field("date", $.date), "close", field("account", $.account), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), commodity: $ => seq( field("date", $.date), "commodity", field("currency", $.currency), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), pad: $ => seq( field("date", $.date), "pad", field("account", $.account), field("from_account", $.account), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), balance: $ => seq( field("date", $.date), "balance", field("account", $.account), field("amount", //choice( // $.amount, $.amount_tolerance, //) ), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), amount: $ => seq( $._number_expr, $.currency ), amount_tolerance: $ => choice( seq( $._number_expr, $.currency ), seq( $._number_expr, "~", $._number_expr, $.currency ) ), // Just Optional number_expr //maybe_number: // Just Optional currency //maybe_currency: compound_amount: $ => choice( seq( field("per", optional($._number_expr)), field("currency", $.currency) ), seq( field("per", $._number_expr), field("currency", optional($.currency)) ), seq( field("per", optional($._number_expr)), "#", field("total", optional($._number_expr)), field("currency", $.currency) ), ), // OPTIONAL // TODO may need a chice here incomplete_amount: $ => seq( $._number_expr, // maybe_number $.currency // maybe_currenecy ), // OPTIONAL cost_spec: $ => choice( seq( "{", field("cost_comp_list", optional($._cost_comp_list)), "}" ), seq( "{{", field("cost_comp_list", optional($._cost_comp_list)), "}}" ), ), // OPTIONAL _cost_comp_list: $ => seq( $.cost_comp, repeat( seq( ",", $.cost_comp ) ) ), cost_comp: $ => choice( $.compound_amount, $.date, $.string, "*" ), price: $ => seq( field("date", $.date), "price", field("currency", $.currency), field("amount", $.amount), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), event: $ => seq( field("date", $.date), "event", field("type", $.string), field("desc", $.string), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), query: $ => seq( field("date", $.date), "query", field("name", $.string), field("query", $.string), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), note: $ => seq( field("date", $.date), "note", field("account", $.account), field("note", $.string), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), filename: $ => $.string, document: $ => seq( field("date", $.date), "document", field("account", $.account), field("filename", $.filename), field("tags_links", optional($.tags_links)), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), custom_value: $ => choice( $.string, $.date, $.bool, $.amount, $._number_expr, $.account ), custom: $ => seq( field("date", $.date), "custom", field("name", $.string), field("custom_value_list", optional( repeat1( $.custom_value ), )), field("comment", optional($.comment)), $._eol, optional($._key_value_list) ), _entry: $ => choice( $.transaction, $.balance, $.open, $.close, $.pad, $.document, $.note, $.event, $.price, $.commodity, $.query, $.custom, ), option: $ => seq( "option", field("key", $.string), field("value", $.string), $._eol, ), include: $ => seq( "include", $.string, $._eol, ), plugin: $ => choice( seq( "plugin", $.string, $._eol ), seq( "plugin", $.string, $.string, $._eol ), ), _directive: $ => choice( $.pushtag, $.poptag, $.pushmeta, $.popmeta, $.option, $.include, $.plugin ), _declarations: $ => choice( $._directive, $._entry, $._skipped_lines, ), /*--------------------------------------------------------------------------------*/ /* UTILITY AND LEXICAL RULES */ /*--------------------------------------------------------------------------------*/ comment: $ => token(seq(';', /[^\r\n]*/)), // NOTE: includes reserved identifiers // Allow uppercase letters to support incomplete account names for LSP completion identifier: $ => /[a-zA-Z]+/, _skipped_lines: $ => choice( seq( $.flag, /[^\r\n]*/, $._eol ), seq( ":", /[^\r\n]*/, $._eol ), $._eol, seq( $.comment, $._eol ), ), } })
{
"$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
"name": "beancount",
"word": "identifier",
"rules": {
"file": {
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "section"
},
{
"type": "SYMBOL",
"name": "_declarations"
},
{
"type": "SYMBOL",
"name": "_nl"
}
]
}
},
"_nl": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "\n"
},
{
"type": "STRING",
"value": "\r"
}
]
},
"_eol": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "\\n"
}
},
"_any": {
"type": "PATTERN",
"value": "[^\\r\\n]*"
},
"section": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "headline",
"content": {
"type": "SYMBOL",
"name": "headline"
}
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_declarations"
},
{
"type": "SYMBOL",
"name": "_nl"
},
{
"type": "FIELD",
"name": "subsection",
"content": {
"type": "SYMBOL",
"name": "section"
}
}
]
}
},
{
"type": "SYMBOL",
"name": "_sectionend"
}
]
},
"_org_stars": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_stars"
},
{
"type": "PATTERN",
"value": "(\\*|#)+"
}
]
},
"headline": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_org_stars"
},
{
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[ \\t]+"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "item",
"content": {
"type": "SYMBOL",
"name": "item"
}
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "_nl"
}
]
},
"item": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[^\\r\\n]+"
}
},
"_indent": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[ \\r\\t]+"
}
},
"atat": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "@@"
}
},
"at": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "@"
}
},
"asterisk": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "*"
}
},
"slash": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "/"
}
},
"plus": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "+"
}
},
"minus": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "-"
}
},
"flag": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[!&?%PSTCURM*#]"
}
},
"_none": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "NULL"
}
},
"bool": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "TRUE|FALSE"
}
},
"date": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "([12]\\d{3}[-\\/](0[1-9]|1[0-2])[-\\/](0[1-9]|[12]\\d|3[01]))"
}
},
"account": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "PATTERN",
"value": "[A-Z][\\p{L}\\p{N}\\u3040-\\u309f\\u30a0-\\u30ff\\u4e00-\\u9fff\\uac00-\\ud7a3]*"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ":"
},
{
"type": "PATTERN",
"value": "[\\p{Lu}\\p{N}\\u3040-\\u309f\\u30a0-\\u30ff\\u4e00-\\u9fff\\uac00-\\ud7a3][\\p{L}\\p{N}\\u3040-\\u309f\\u30a0-\\u30ff\\u4e00-\\u9fff\\uac00-\\ud7a3\\-]*"
}
]
}
}
]
}
},
"currency": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[A-Z]([A-Z0-9\\'\\._\\-]{0,22}[A-Z0-9])?"
}
},
"string": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "\"([^\"]|\\\\\")*\""
}
},
"unquoted_string": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": -1,
"content": {
"type": "PATTERN",
"value": "[^\\r\\n]+"
}
}
},
"number": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "([0-9]+|[0-9][0-9,]+[0-9])(\\.[0-9]*)?"
}
},
"tag": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "#[A-Za-z0-9\\-_/.]+"
}
},
"link": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "\\^[A-Za-z0-9\\-_/.]+"
}
},
"txn": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "txn"
},
{
"type": "SYMBOL",
"name": "flag"
},
{
"type": "STRING",
"value": "*"
},
{
"type": "STRING",
"value": "#"
}
]
},
"_number_expr": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "number"
},
{
"type": "SYMBOL",
"name": "_paren__number_expr"
},
{
"type": "SYMBOL",
"name": "unary_number_expr"
},
{
"type": "SYMBOL",
"name": "binary_number_expr"
}
]
},
"_paren__number_expr": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "STRING",
"value": ")"
}
]
},
"unary_number_expr": {
"type": "PREC",
"value": 3,
"content": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "minus"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "plus"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
}
]
}
},
"binary_number_expr": {
"type": "PREC",
"value": 3,
"content": {
"type": "CHOICE",
"members": [
{
"type": "PREC_LEFT",
"value": 1,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "plus"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
}
},
{
"type": "PREC_LEFT",
"value": 1,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "minus"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
}
},
{
"type": "PREC_LEFT",
"value": 2,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "asterisk"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
}
},
{
"type": "PREC_LEFT",
"value": 2,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "slash"
},
{
"type": "SYMBOL",
"name": "_number_expr"
}
]
}
}
]
}
},
"_txn_strings": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "payee",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "string"
},
"named": true,
"value": "payee"
}
},
{
"type": "FIELD",
"name": "narration",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "string"
},
"named": true,
"value": "narration"
}
}
]
},
{
"type": "FIELD",
"name": "narration",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "string"
},
"named": true,
"value": "narration"
}
}
]
},
"tags_links": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "link"
},
{
"type": "SYMBOL",
"name": "tag"
}
]
}
},
"transaction": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "FIELD",
"name": "txn",
"content": {
"type": "SYMBOL",
"name": "txn"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_txn_strings"
},
{
"type": "BLANK"
}
]
},
{
"type": "FIELD",
"name": "tags_links",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "tags_links"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "SYMBOL",
"name": "tags_links"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SYMBOL",
"name": "_key_value_line"
},
{
"type": "SYMBOL",
"name": "posting"
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "SYMBOL",
"name": "comment"
}
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
}
]
}
},
{
"type": "BLANK"
}
]
}
]
},
"optflag": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "*"
},
{
"type": "STRING",
"value": "#"
},
{
"type": "SYMBOL",
"name": "flag"
}
]
},
"price_annotation": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "incomplete_amount"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
},
"posting": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "FIELD",
"name": "optflag",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "optflag"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "FIELD",
"name": "account",
"content": {
"type": "SYMBOL",
"name": "account"
}
},
{
"type": "FIELD",
"name": "amount",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "incomplete_amount"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "FIELD",
"name": "cost_spec",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "cost_spec"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "at"
},
{
"type": "SYMBOL",
"name": "atat"
}
]
},
{
"type": "FIELD",
"name": "price_annotation",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "price_annotation"
},
{
"type": "BLANK"
}
]
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"key": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "[a-z][a-zA-Z0-9\\-_]+"
}
},
"currency_key_value": {
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "currency"
},
"named": true,
"value": "key"
},
{
"type": "STRING",
"value": ":"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "PATTERN",
"value": " "
}
},
{
"type": "FIELD",
"name": "value",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "value_currency"
},
"named": true,
"value": "value"
}
}
]
},
{
"type": "BLANK"
}
]
}
]
}
},
"value": {
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "date"
},
{
"type": "SYMBOL",
"name": "currency"
},
{
"type": "SYMBOL",
"name": "account"
},
{
"type": "SYMBOL",
"name": "tag"
},
{
"type": "SYMBOL",
"name": "bool"
},
{
"type": "SYMBOL",
"name": "_none"
},
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "amount"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "unquoted_string"
}
]
}
},
"value_currency": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "currency"
}
]
},
"key_value": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "currency_key_value"
},
{
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "key"
},
{
"type": "STRING",
"value": ":"
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "PATTERN",
"value": " "
}
},
{
"type": "SYMBOL",
"name": "value"
}
]
},
{
"type": "BLANK"
}
]
}
]
}
}
]
},
"_key_value_line": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "SYMBOL",
"name": "key_value"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"_key_value_list": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_line"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "SYMBOL",
"name": "comment"
}
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
}
]
}
},
"pushtag": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "pushtag"
},
{
"type": "SYMBOL",
"name": "tag"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"poptag": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "poptag"
},
{
"type": "SYMBOL",
"name": "tag"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"pushmeta": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "pushmeta"
},
{
"type": "SYMBOL",
"name": "key_value"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"popmeta": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "popmeta"
},
{
"type": "SYMBOL",
"name": "key"
},
{
"type": "STRING",
"value": ":"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"open": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "open"
},
{
"type": "FIELD",
"name": "account",
"content": {
"type": "SYMBOL",
"name": "account"
}
},
{
"type": "FIELD",
"name": "currencies",
"content": {
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "currency"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "currency"
}
]
}
}
]
}
}
},
{
"type": "FIELD",
"name": "opt_booking",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "opt_booking"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"opt_booking": {
"type": "SYMBOL",
"name": "string"
},
"close": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "close"
},
{
"type": "FIELD",
"name": "account",
"content": {
"type": "SYMBOL",
"name": "account"
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"commodity": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "commodity"
},
{
"type": "FIELD",
"name": "currency",
"content": {
"type": "SYMBOL",
"name": "currency"
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"pad": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "pad"
},
{
"type": "FIELD",
"name": "account",
"content": {
"type": "SYMBOL",
"name": "account"
}
},
{
"type": "FIELD",
"name": "from_account",
"content": {
"type": "SYMBOL",
"name": "account"
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"balance": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "balance"
},
{
"type": "FIELD",
"name": "account",
"content": {
"type": "SYMBOL",
"name": "account"
}
},
{
"type": "FIELD",
"name": "amount",
"content": {
"type": "SYMBOL",
"name": "amount_tolerance"
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"amount": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
},
"amount_tolerance": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "STRING",
"value": "~"
},
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
}
]
},
"compound_amount": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "per",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "FIELD",
"name": "currency",
"content": {
"type": "SYMBOL",
"name": "currency"
}
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "per",
"content": {
"type": "SYMBOL",
"name": "_number_expr"
}
},
{
"type": "FIELD",
"name": "currency",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "currency"
},
{
"type": "BLANK"
}
]
}
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "per",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "STRING",
"value": "#"
},
{
"type": "FIELD",
"name": "total",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "FIELD",
"name": "currency",
"content": {
"type": "SYMBOL",
"name": "currency"
}
}
]
}
]
},
"incomplete_amount": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "currency"
}
]
},
"cost_spec": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "FIELD",
"name": "cost_comp_list",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_cost_comp_list"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "STRING",
"value": "}"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{{"
},
{
"type": "FIELD",
"name": "cost_comp_list",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_cost_comp_list"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "STRING",
"value": "}}"
}
]
}
]
},
"_cost_comp_list": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "cost_comp"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "cost_comp"
}
]
}
}
]
},
"cost_comp": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "compound_amount"
},
{
"type": "SYMBOL",
"name": "date"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "STRING",
"value": "*"
}
]
},
"price": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "price"
},
{
"type": "FIELD",
"name": "currency",
"content": {
"type": "SYMBOL",
"name": "currency"
}
},
{
"type": "FIELD",
"name": "amount",
"content": {
"type": "SYMBOL",
"name": "amount"
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"event": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "event"
},
{
"type": "FIELD",
"name": "type",
"content": {
"type": "SYMBOL",
"name": "string"
}
},
{
"type": "FIELD",
"name": "desc",
"content": {
"type": "SYMBOL",
"name": "string"
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"query": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "query"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "string"
}
},
{
"type": "FIELD",
"name": "query",
"content": {
"type": "SYMBOL",
"name": "string"
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"note": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "note"
},
{
"type": "FIELD",
"name": "account",
"content": {
"type": "SYMBOL",
"name": "account"
}
},
{
"type": "FIELD",
"name": "note",
"content": {
"type": "SYMBOL",
"name": "string"
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"filename": {
"type": "SYMBOL",
"name": "string"
},
"document": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "document"
},
{
"type": "FIELD",
"name": "account",
"content": {
"type": "SYMBOL",
"name": "account"
}
},
{
"type": "FIELD",
"name": "filename",
"content": {
"type": "SYMBOL",
"name": "filename"
}
},
{
"type": "FIELD",
"name": "tags_links",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "tags_links"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"custom_value": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "date"
},
{
"type": "SYMBOL",
"name": "bool"
},
{
"type": "SYMBOL",
"name": "amount"
},
{
"type": "SYMBOL",
"name": "_number_expr"
},
{
"type": "SYMBOL",
"name": "account"
}
]
},
"custom": {
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "date",
"content": {
"type": "SYMBOL",
"name": "date"
}
},
{
"type": "STRING",
"value": "custom"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "string"
}
},
{
"type": "FIELD",
"name": "custom_value_list",
"content": {
"type": "CHOICE",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "custom_value"
}
},
{
"type": "BLANK"
}
]
}
},
{
"type": "FIELD",
"name": "comment",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "BLANK"
}
]
}
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_key_value_list"
},
{
"type": "BLANK"
}
]
}
]
},
"_entry": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "transaction"
},
{
"type": "SYMBOL",
"name": "balance"
},
{
"type": "SYMBOL",
"name": "open"
},
{
"type": "SYMBOL",
"name": "close"
},
{
"type": "SYMBOL",
"name": "pad"
},
{
"type": "SYMBOL",
"name": "document"
},
{
"type": "SYMBOL",
"name": "note"
},
{
"type": "SYMBOL",
"name": "event"
},
{
"type": "SYMBOL",
"name": "price"
},
{
"type": "SYMBOL",
"name": "commodity"
},
{
"type": "SYMBOL",
"name": "query"
},
{
"type": "SYMBOL",
"name": "custom"
}
]
},
"option": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "option"
},
{
"type": "FIELD",
"name": "key",
"content": {
"type": "SYMBOL",
"name": "string"
}
},
{
"type": "FIELD",
"name": "value",
"content": {
"type": "SYMBOL",
"name": "string"
}
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"include": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "include"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
"plugin": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "plugin"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "plugin"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "string"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
}
]
},
"_directive": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "pushtag"
},
{
"type": "SYMBOL",
"name": "poptag"
},
{
"type": "SYMBOL",
"name": "pushmeta"
},
{
"type": "SYMBOL",
"name": "popmeta"
},
{
"type": "SYMBOL",
"name": "option"
},
{
"type": "SYMBOL",
"name": "include"
},
{
"type": "SYMBOL",
"name": "plugin"
}
]
},
"_declarations": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_directive"
},
{
"type": "SYMBOL",
"name": "_entry"
},
{
"type": "SYMBOL",
"name": "_skipped_lines"
}
]
},
"comment": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ";"
},
{
"type": "PATTERN",
"value": "[^\\r\\n]*"
}
]
}
},
"identifier": {
"type": "PATTERN",
"value": "[a-zA-Z]+"
},
"_skipped_lines": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "flag"
},
{
"type": "PATTERN",
"value": "[^\\r\\n]*"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ":"
},
{
"type": "PATTERN",
"value": "[^\\r\\n]*"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
},
{
"type": "SYMBOL",
"name": "_eol"
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "SYMBOL",
"name": "_eol"
}
]
}
]
}
},
"extras": [
{
"type": "PATTERN",
"value": "( |\\r|\\t)+"
}
],
"conflicts": [],
"precedences": [],
"externals": [
{
"type": "SYMBOL",
"name": "_stars"
},
{
"type": "SYMBOL",
"name": "_sectionend"
},
{
"type": "SYMBOL",
"name": "_eof"
}
],
"inline": [
"currency_key_value"
],
"supertypes": [
"_entry",
"_directive"
],
"reserved": {}
}
Beancount OK
; Full beancount example — all directive and entry types option "title" "Full Example Ledger" option "operating_currency" "GBP" plugin "beancount.plugins.auto_accounts" include "other.beancount" ; Commodity declarations 2024-01-01 commodity GBP name: "British Pound" 2024-01-01 commodity USD 2024-01-01 commodity EUR ; Account lifecycle 2024-01-01 open Assets:Bank:Current GBP 2024-01-01 open Assets:Bank:Savings GBP,USD 2024-01-01 open Expenses:Food GBP 2024-01-01 open Expenses:Rent GBP 2024-01-01 open Income:Salary GBP 2024-01-01 open Liabilities:CreditCard GBP 2024-01-01 open Equity:Opening-Balances 2024-12-31 close Liabilities:CreditCard ; Transactions 2024-01-15 * "Opening balance" Assets:Bank:Current 5000.00 GBP Equity:Opening-Balances 2024-02-01 * "Landlord" "Monthly rent" Expenses:Rent 1200.00 GBP Assets:Bank:Current ; Balance assertion 2024-02-01 balance Assets:Bank:Current 3800.00 GBP ; Pad directive 2024-03-01 pad Assets:Bank:Current Equity:Opening-Balances ; Note directive 2024-03-15 note Assets:Bank:Current "Switched to premium account" ; Document directive 2024-04-01 document Assets:Bank:Current "/documents/statement-2024-04.pdf" ; Event directive 2024-05-01 event "location" "London" ; Price directive 2024-06-01 price USD 0.79 GBP 2024-06-01 price EUR 0.86 GBP ; Query directive 2024-07-01 query "monthly-expenses" " SELECT account, sum(position) WHERE account ~ 'Expenses' " ; Custom directive 2024-08-01 custom "budget" Expenses:Food ; Tags pushtag #project-alpha 2024-09-01 * "Tagged transaction" Expenses:Food 25.00 GBP Assets:Bank:Current poptag #project-alpha ; Metadata pushmeta reviewer: "alice" 2024-10-01 * "Reviewed transaction" Expenses:Food 30.00 GBP Assets:Bank:Current popmeta reviewer: ; Transaction with all the trimmings 2024-11-01 * "Complex Corp" "Full-featured transaction" #work ^invoice-42 category: "consulting" Expenses:Food 100.00 GBP receipt: "receipt-42.pdf" Assets:Bank:Current -100.00 GBP 2024-12-01 * "Year-end transaction" Expenses:Food 50.00 GBP Assets:Bank:Current
Goluca OK
; DROPPED: option ; DROPPED: option ; DROPPED: plugin ; DROPPED: include ; DROPPED: commodity ; DROPPED: commodity ; DROPPED: commodity ; DROPPED: open ; DROPPED: open ; DROPPED: open ; DROPPED: open ; DROPPED: open ; DROPPED: open ; DROPPED: open ; DROPPED: close 2024-01-15 * Equity:Opening-Balances -> Assets:Bank:Current "Opening balance" 5000.00 GBP 2024-02-01 * Assets:Bank:Current -> Expenses:Rent "Landlord — Monthly rent" 1200.00 GBP ; DROPPED: balance ; DROPPED: pad ; DROPPED: note ; DROPPED: document ; DROPPED: event ; DROPPED: price ; DROPPED: price ; DROPPED: query ; DROPPED: custom ; DROPPED: pushtag 2024-09-01 * Assets:Bank:Current -> Expenses:Food "Tagged transaction" 25.00 GBP ; DROPPED: poptag ; DROPPED: pushmeta 2024-10-01 * Assets:Bank:Current -> Expenses:Food "Reviewed transaction" 30.00 GBP ; DROPPED: popmeta 2024-11-01 * Assets:Bank:Current -> Expenses:Food "Complex Corp — Full-featured transaction" 100.00 GBP 2024-12-01 * Assets:Bank:Current -> Expenses:Food "Year-end transaction" 50.00 GBP
Flow Diagram
(file
(comment)
(option
(string)
(string)
)
(option
(string)
(string)
)
(plugin
(string)
)
(include
(string)
)
(comment)
(commodity
(date)
(currency)
(key_value
(key)
(value
(string)
)
)
)
(commodity
(date)
(currency)
)
(commodity
(date)
(currency)
)
(comment)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
(currency)
(currency)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
)
(close
(date)
(account)
)
(comment)
(transaction
(date)
(txn)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
(transaction
(date)
(txn)
(payee)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
(comment)
(balance
(date)
(account)
(amount_tolerance
(number)
(currency)
)
)
(comment)
(pad
(date)
(account)
(account)
)
(comment)
(note
(date)
(account)
(string)
)
(comment)
(document
(date)
(account)
(filename
(string)
)
)
(comment)
(event
(date)
(string)
(string)
)
(comment)
(price
(date)
(currency)
(amount
(number)
(currency)
)
)
(price
(date)
(currency)
(amount
(number)
(currency)
)
)
(comment)
(query
(date)
(string)
(string)
)
(comment)
(custom
(date)
(string)
(custom_value
(account)
)
)
(comment)
(pushtag
(tag)
)
(transaction
(date)
(txn)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
(poptag
(tag)
)
(comment)
(pushmeta
(key_value
(key)
(value
(string)
)
)
)
(transaction
(date)
(txn)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
(popmeta
(key)
)
(comment)
(transaction
(date)
(txn)
(payee)
(narration)
(tags_links
(tag)
(link)
)
(key_value
(key)
(value
(string)
)
)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(key_value
(key)
(value
(string)
)
)
(posting
(account)
(incomplete_amount
(unary_number_expr
(minus)
(number)
)
(currency)
)
)
)
(transaction
(date)
(txn)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
)
Beancount OK
; Simple beancount example option "title" "Simple Ledger" option "operating_currency" "GBP" 2024-01-01 open Assets:Bank:Current GBP 2024-01-01 open Expenses:Groceries GBP 2024-01-01 open Income:Salary GBP 2024-01-01 open Equity:Opening-Balances 2024-01-01 * "Opening balance" Assets:Bank:Current 1000.00 GBP Equity:Opening-Balances 2024-01-15 * "Tesco" "Weekly groceries" Expenses:Groceries 45.50 GBP Assets:Bank:Current
Goluca OK
; DROPPED: option ; DROPPED: option ; DROPPED: open ; DROPPED: open ; DROPPED: open ; DROPPED: open 2024-01-01 * Equity:Opening-Balances -> Assets:Bank:Current "Opening balance" 1000.00 GBP 2024-01-15 * Assets:Bank:Current -> Expenses:Groceries "Tesco — Weekly groceries" 45.50 GBP
Flow Diagram
(file
(comment)
(option
(string)
(string)
)
(option
(string)
(string)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
)
(transaction
(date)
(txn)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
(transaction
(date)
(txn)
(payee)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
)
Beancount OK
; Transaction variations option "title" "Transaction Examples" 2024-01-01 open Assets:Bank:Current GBP 2024-01-01 open Assets:Bank:Savings GBP,USD 2024-01-01 open Expenses:Food GBP 2024-01-01 open Expenses:Travel GBP,USD 2024-01-01 open Income:Salary GBP 2024-01-01 open Equity:Opening-Balances ; Simple transaction with payee and narration 2024-02-01 * "Sainsburys" "Lunch supplies" Expenses:Food 12.30 GBP Assets:Bank:Current ; Transaction with tags and links 2024-02-05 * "Flight to Paris" #travel ^trip-2024 Expenses:Travel 250.00 GBP Assets:Bank:Current ; Transaction with metadata 2024-02-10 * "Monthly salary" invoice: "2024-02-001" Assets:Bank:Current 3500.00 GBP Income:Salary ; Transaction with cost spec 2024-02-15 * "Buy USD" Assets:Bank:Savings 500.00 USD {0.79 GBP} Assets:Bank:Current -395.00 GBP ; Transaction with price annotation 2024-02-20 * "Convert GBP to USD" Assets:Bank:Savings 100.00 USD @ 0.79 GBP Assets:Bank:Current ; Flagged transaction (!) 2024-02-25 ! "Pending refund" Assets:Bank:Current 50.00 GBP Expenses:Travel ; Transaction with arithmetic 2024-02-28 * "Split bill" Expenses:Food (90.00 / 3) GBP Assets:Bank:Current
Goluca ERRORS
; DROPPED: option ; DROPPED: open ; DROPPED: open ; DROPPED: open ; DROPPED: open ; DROPPED: open ; DROPPED: open 2024-02-01 * Assets:Bank:Current -> Expenses:Food "Sainsburys — Lunch supplies" 12.30 GBP 2024-02-05 * Assets:Bank:Current -> Expenses:Travel "Flight to Paris" 250.00 GBP 2024-02-10 * Income:Salary -> Assets:Bank:Current "Monthly salary" 3500.00 GBP 2024-02-15 * Assets:Bank:Current -> Assets:Bank:Savings "Buy USD" 500.00 USD 2024-02-20 * Assets:Bank:Current -> Assets:Bank:Savings "Convert GBP to USD" 100.00 USD 2024-02-25 ! Expenses:Travel -> Assets:Bank:Current "Pending refund" 50.00 GBP 2024-02-28 * Assets:Bank:Current -> Expenses:Food "Split bill" GBP
Flow Diagram
(file
(comment)
(option
(string)
(string)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
(currency)
(currency)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
(currency)
(currency)
)
(open
(date)
(account)
(currency)
)
(open
(date)
(account)
)
(comment)
(transaction
(date)
(txn)
(payee)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
(comment)
(transaction
(date)
(txn)
(narration)
(tags_links
(tag)
(link)
)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
(comment)
(transaction
(date)
(txn)
(narration)
(key_value
(key)
(value
(string)
)
)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
(comment)
(transaction
(date)
(txn)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
(cost_spec
(cost_comp
(compound_amount
(number)
(currency)
)
)
)
)
(posting
(account)
(incomplete_amount
(unary_number_expr
(minus)
(number)
)
(currency)
)
)
)
(comment)
(transaction
(date)
(txn)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
(at)
(price_annotation
(incomplete_amount
(number)
(currency)
)
)
)
(posting
(account)
)
)
(comment)
(transaction
(date)
(txn
(flag)
)
(narration)
(posting
(account)
(incomplete_amount
(number)
(currency)
)
)
(posting
(account)
)
)
(comment)
(transaction
(date)
(txn)
(narration)
(posting
(account)
(incomplete_amount
(binary_number_expr
(number)
(slash)
(number)
)
(currency)
)
)
(posting
(account)
)
)
)