A human-friendly DSL for ATProto Lexicons forked from stavola.xyz/mlf
README.md

tree-sitter-mlf #

MLF (Matt's Lexicon Format) grammar for tree-sitter.

Installation #

npm #

npm install tree-sitter-mlf

Cargo #

[dependencies]
tree-sitter-mlf = "0.1"

Usage #

Rust #

use tree_sitter::Parser;

let code = r#"
record post {
    text: string constrained {
        maxLength: 300,
    },
}
"#;

let mut parser = Parser::new();
let language = tree_sitter_mlf::LANGUAGE;
parser.set_language(&language.into()).unwrap();
let tree = parser.parse(code, None).unwrap();

JavaScript #

const Parser = require('tree-sitter');
const MLF = require('tree-sitter-mlf');

const parser = new Parser();
parser.setLanguage(MLF);

const code = `
record post {
    text: string,
}
`;

const tree = parser.parse(code);

Development #

Generate the parser #

# Install tree-sitter CLI
npm install

# Generate parser
npx tree-sitter generate

# Test the grammar
npx tree-sitter test

Build Rust bindings #

cd bindings/rust
cargo build
cargo test

Features #

  • Full MLF syntax support
  • Records, aliases, tokens, queries, procedures, subscriptions
  • Type system with primitives, references, arrays, unions, objects
  • Constrained types with validation rules
  • Syntax highlighting queries included

Editor Support #

This grammar can be used with:

  • Neovim - Via nvim-treesitter
  • Emacs - Via tree-sitter-mode
  • Helix - Built-in tree-sitter support
  • VS Code - Via tree-sitter extensions