Beancount

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.

ABNF Grammar

; @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]+")
ABNF → JSON round-trip
{
  "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"
  ]
}

Source Files

grammar.js
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
                ),
            ),

    }
})
grammar.json
{
  "$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": {}
}

Parser Demos

full.beancount

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

Opening-Balances -5000.00 GBP Current 3595.00 GBP Food 205.00 GBP Rent 1200.00 GBP Opening balance 5000.00 GBP Landlord — Monthly rent 1200.00 GBP Tagged transaction 25.00 GBP Reviewed transaction 30.00 GBP Complex Corp — Full-featured transaction 100.00 GBP Year-end transaction 50.00 GBP Equity Asset Expense
AST (beancount)
(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)
    )
  )
)

simple.beancount

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

Opening-Balances -1000.00 GBP Current 954.50 GBP Groceries 45.50 GBP Opening balance 1000.00 GBP Tesco — Weekly groceries 45.50 GBP Equity Asset Expense
AST (beancount)
(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)
    )
  )
)

transactions.beancount

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

AST (beancount)
(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)
    )
  )
)