| Crates.io | tree-sitter-beancount |
| lib.rs | tree-sitter-beancount |
| version | 2.4.1 |
| created_at | 2021-11-11 15:22:36.366554+00 |
| updated_at | 2025-07-21 01:35:22.1155+00 |
| description | beancount grammar for the tree-sitter parsing library |
| homepage | |
| repository | https://github.com/polarmutex/tree-sitter-beancount |
| max_upload_size | |
| id | 480203 |
| size | 607,000 |
A Tree-sitter parser for the Beancount double-entry accounting language.
npm install tree-sitter tree-sitter-beancount
Add to your Cargo.toml:
[dependencies]
tree-sitter = "~0.24.7"
tree-sitter-beancount = "2.3.3"
pip install tree-sitter tree-sitter-beancount
const Parser = require('tree-sitter');
const Beancount = require('tree-sitter-beancount');
const parser = new Parser();
parser.setLanguage(Beancount);
const sourceCode = `
2023-01-01 * "Opening Balance"
Assets:Checking:Bank1 1000.00 USD
Equity:Opening-Balances
2023-01-02 * "Coffee" #food
Expenses:Food:Coffee 4.50 USD
Assets:Checking:Bank1 -4.50 USD
`;
const tree = parser.parse(sourceCode);
console.log(tree.rootNode.toString());
use tree_sitter::{Parser, Language};
extern "C" { fn tree_sitter_beancount() -> Language; }
fn main() {
let mut parser = Parser::new();
let language = unsafe { tree_sitter_beancount() };
parser.set_language(language).expect("Error loading Beancount grammar");
let source_code = r#"
2023-01-01 open Assets:Checking:Bank1 USD
2023-01-01 * "Salary"
Income:Salary -5000.00 USD
Assets:Checking:Bank1 5000.00 USD
"#;
let tree = parser.parse(source_code, None).unwrap();
println!("{}", tree.root_node().to_sexp());
}
import tree_sitter_beancount as tsbeancount
from tree_sitter import Language, Parser
BEANCOUNT_LANGUAGE = Language(tsbeancount.language(), "beancount")
parser = Parser()
parser.set_language(BEANCOUNT_LANGUAGE)
source_code = b'''
2023-01-01 open Assets:Checking:Bank1 USD
2023-01-01 balance Assets:Checking:Bank1 0.00 USD
2023-01-15 * "Paycheck"
Income:Salary -3000.00 USD
Assets:Checking:Bank1 3000.00 USD
'''
tree = parser.parse(source_code)
print(tree.root_node.sexp())
With nvim-treesitter:
require'nvim-treesitter.configs'.setup {
ensure_installed = { "beancount" },
highlight = { enable = true },
incremental_selection = { enable = true },
indent = { enable = true },
}
With tree-sitter-langs:
(use-package tree-sitter-langs
:config
(tree-sitter-require 'beancount))
Install the Beancount extension which uses this parser for syntax highlighting.
This parser supports the complete Beancount syntax including:
2023-01-01 * "Description"open, closebalancepriceeventnotedocumentcustom{100.00 USD}, {{100.00 USD}}@ 1.25 EUR, @@ 125.00 EUR100 + 50 * 2#tag, ^linkkey: value pairs;commentoption, pluginincludeAssets:银行:储蓄账户* Heading, ** Subheading# Title, ## Subtitle2023-01-15 * "Coffee Shop" "Morning coffee"
Expenses:Food:Coffee 4.50 USD
Assets:Checking:Bank1 -4.50 USD
2023-01-01 open Assets:银行:工商银行 CNY
2023-01-15 * "工资" #salary
Income:工资收入 -8000.00 CNY
Assets:银行:工商银行 8000.00 CNY
2023-01-20 * "Stock Purchase"
Assets:Investments:AAPL 10 AAPL {150.00 USD} @ 151.00 USD
Assets:Checking:Bank1 -1510.00 USD
* Personal Finance
** Income
2023-01-01 * "Salary"
Income:Salary -5000.00 USD
Assets:Checking 5000.00 USD
** Expenses
2023-01-02 * "Groceries"
Expenses:Food:Groceries 50.00 USD
Assets:Checking -50.00 USD
git clone https://github.com/polarmutex/tree-sitter-beancount.git
cd tree-sitter-beancount
npm install
npm install -g tree-sitter-cli
Generate the parser:
tree-sitter generate
Run the test suite:
tree-sitter test
Run specific tests:
tree-sitter test --file-name chinese_characters.txt
Debug parsing:
tree-sitter parse examples/sample.beancount
This parser is optimized for high performance:
Performance has been significantly improved through:
Contributions are welcome! Please:
git checkout -b feature-nametree-sitter testPlease report bugs and feature requests on GitHub Issues.
This project is licensed under the MIT License - see the LICENSE file for details.