Skip to main content

AL for Business Central

Project description

tree-sitter-al

A tree-sitter parser for the AL programming language used in Microsoft Dynamics 365 Business Central.

PyPI crates.io npm

Parser Status

Validated against 15,358 production AL files from the Business Central codebase:

Metric Value
Success rate 100% (15,358 / 15,358 files)
Tests 1,404
parser.c size ~11 MB
grammar.js ~3,100 lines
Named keywords 82 (queryable via highlights/tags)
Scanner tokens 8 (stateful, depth-tracking)
Query files 5 (highlights, locals, tags, indents, folds)

Installation

Rust

cargo add tree-sitter-al
use tree_sitter::Parser;

let mut parser = Parser::new();
let language = tree_sitter_al::LANGUAGE;
parser.set_language(&language.into()).expect("Error loading AL grammar");
let tree = parser.parse("codeunit 50100 MyCodeunit { }", None).unwrap();
println!("{}", tree.root_node().to_sexp());

Query constants are also available:

use tree_sitter_al::{HIGHLIGHTS_QUERY, TAGS_QUERY, LOCALS_QUERY, FOLDS_QUERY, INDENTS_QUERY};

Python (tree-sitter 0.24+)

pip install tree-sitter-al
import tree_sitter
import tree_sitter_al

lang = tree_sitter.Language(tree_sitter_al.language())
parser = tree_sitter.Parser(lang)
tree = parser.parse(b'codeunit 50100 MyCodeunit { }')
print(tree.root_node.sexp())

Node.js

npm install tree-sitter-al

Pre-built binaries

Download from GitHub Releases:

File Platform Use case
tree-sitter-al.wasm All web-tree-sitter
tree-sitter-al.so Linux x86_64 ast-grep, native bindings
tree-sitter-al.dll Windows x86_64 ast-grep, native bindings
tree-sitter-al.dylib macOS ARM64 ast-grep, native bindings

V2 Architecture

The grammar was rewritten from scratch in March 2026, achieving a 10x reduction in parser size while improving correctness.

Before / After

Metric V1 V2
parser.c 106 MB (can't push to GitHub) 10.6 MB
Errors 14 0
Success rate 99.91% 100%
Symbols 2,249 ~740
States 29,126 ~5,300
grammar.js 8,500 lines ~3,100 lines
Tests 1,225 1,404
Keywords invisible in queries 82 named nodes
Query files 3 (partial) 5 (comprehensive)

Key design decisions

  • Stateful external scanner — 8 scanner tokens handle property disambiguation, depth tracking (#if/#endif nesting), named begin/end keywords at depth 0, and split-construct detection via lookahead.
  • Parse structure, don't validate — Accept any Name = Value ; as a property. Semantic validation belongs in linters/LSP servers, not the parser.
  • Generic preprocessor — One preproc_conditional rule + ~15 dedicated rules for genuinely complex split constructs (begin/end, var/begin, brace-close across #if/#else branches).
  • 82 named keyword nodes — All keywords including begin/end are named nodes, enabling proper syntax highlighting and code navigation queries.

See docs/v2-blog-post-notes.md for the full rewrite narrative.

Development

Prerequisites

  • Node.js (v16+)
  • tree-sitter CLI: npm install -g tree-sitter-cli

Building

tree-sitter generate    # Generate parser from grammar.js
tree-sitter test        # Run test suite

Validation

./validate-grammar.sh        # Quick: generation, tests, orphan/duplicate detection
./validate-grammar.sh --full # Full: includes production AL file parsing

Parsing AL files

tree-sitter parse path/to/file.al
tree-sitter parse path/to/file.al -d    # Debug output
tree-sitter parse path/to/file.al -q    # Quiet (errors only)

Key files

File Purpose
grammar.js Main grammar definition
src/scanner.c External scanner (8 tokens: property, depth tracking, named begin/end, split detection)
test/corpus/ Test suite (1,404 tests)
queries/ Syntax highlighting, code navigation, folding, indentation

Contributing

See CLAUDE.md for detailed development guidelines including architecture, debugging, and conventions.


Author: Torben Leth (sshadows@sshadows.dk) License: MIT (see LICENSE)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tree_sitter_al-2.4.0.tar.gz (1.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tree_sitter_al-2.4.0-cp312-abi3-win_amd64.whl (414.9 kB view details)

Uploaded CPython 3.12+Windows x86-64

tree_sitter_al-2.4.0-cp312-abi3-win32.whl (406.1 kB view details)

Uploaded CPython 3.12+Windows x86

tree_sitter_al-2.4.0-cp312-abi3-musllinux_1_2_x86_64.whl (468.6 kB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ x86-64

tree_sitter_al-2.4.0-cp312-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (471.7 kB view details)

Uploaded CPython 3.12+manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

tree_sitter_al-2.4.0-cp312-abi3-macosx_11_0_arm64.whl (448.4 kB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

File details

Details for the file tree_sitter_al-2.4.0.tar.gz.

File metadata

  • Download URL: tree_sitter_al-2.4.0.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tree_sitter_al-2.4.0.tar.gz
Algorithm Hash digest
SHA256 5037acb5197ce9d6f97082e48ad0854a5b6ef8afbd374012bb58876bd31ae274
MD5 2840a49fc698097693ce975884481ee3
BLAKE2b-256 51ebcd79e3a355cf4c8dc537e07c25582afbe2da2b0e45402b001fe320900cbb

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_al-2.4.0.tar.gz:

Publisher: publish-pypi.yml on SShadowS/tree-sitter-al

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_al-2.4.0-cp312-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for tree_sitter_al-2.4.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 275426c3af9c8acb640983537d173b1e966517f0c91dbc9038f5eb73a99eb407
MD5 1b0ba72d11d7219fc022ea55272a7572
BLAKE2b-256 c024bc9905e15cd114f6a044a73f761affe2db447af61c1845f4cf630c28bbf1

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_al-2.4.0-cp312-abi3-win_amd64.whl:

Publisher: publish-pypi.yml on SShadowS/tree-sitter-al

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_al-2.4.0-cp312-abi3-win32.whl.

File metadata

  • Download URL: tree_sitter_al-2.4.0-cp312-abi3-win32.whl
  • Upload date:
  • Size: 406.1 kB
  • Tags: CPython 3.12+, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tree_sitter_al-2.4.0-cp312-abi3-win32.whl
Algorithm Hash digest
SHA256 81d8bd9d532a78858bee71c1e0654e49c64d995cc5bb496b3b4ba11bcd9742ac
MD5 2f481f2cece8bba94210f2159000704f
BLAKE2b-256 ffb090b2c87e04e984a463e1aba39b1575438ab060eb8b562bbf8d261c8404cd

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_al-2.4.0-cp312-abi3-win32.whl:

Publisher: publish-pypi.yml on SShadowS/tree-sitter-al

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_al-2.4.0-cp312-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_al-2.4.0-cp312-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f062902ccbb13ca4830c1a9cfd0fb8dbef680214edf89332a1a02621cb47022d
MD5 67fe1867efbe822be97a117c8fc080ef
BLAKE2b-256 cb7e046de6e033c1ccfab62453515157e0c793f9ee150fca653c5c730e8c75ca

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_al-2.4.0-cp312-abi3-musllinux_1_2_x86_64.whl:

Publisher: publish-pypi.yml on SShadowS/tree-sitter-al

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_al-2.4.0-cp312-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_al-2.4.0-cp312-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 293b645fb101c45db4258ba012a4d3e760e12f339b7fcf9d4d996cc5d955fbec
MD5 686aa50fda3a4fde67495d933b790a2b
BLAKE2b-256 f1f2c8c44319ffdf1e209a208f0dcc3888cfbbb59669ddb04bce7fab4361649f

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_al-2.4.0-cp312-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: publish-pypi.yml on SShadowS/tree-sitter-al

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tree_sitter_al-2.4.0-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tree_sitter_al-2.4.0-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 110b6a3e16df9d9ae0fd00ea37767cecb0dac0c970b9e286c230542723bb4cd2
MD5 aaf438e68032a37cf9c43221bf532018
BLAKE2b-256 282ff67fd3d2548e276d9639c48808af3621fa4dc45264ddd061c0501806ec12

See more details on using hashes here.

Provenance

The following attestation bundles were made for tree_sitter_al-2.4.0-cp312-abi3-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on SShadowS/tree-sitter-al

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page