# Tree-Sitter-Lean4
Lean4 is a programming language, commonly used for mathematical theorem proving as a [proof assistant](https://en.wikipedia.org/wiki/Proof_assistant).
This project contains:
- Tree-Sitter grammar for parsing [Lean 4](github.com/leanprover/lean4) source code.
- Rust crate that can be used in combination with `tree-sitter` crate with bindings for parsing Lean
- Nix flake for using the compiled parser in other tools in the Tree-Sitter ecosystem such as AST-Grep
**Important**: Lean is a very extensible language. Therefore, the Tree-Sitter grammar is of limited use. For parsing advanced Lean programs you will need to use the Lean kernel. See also [Metaprogramming in Lean](https://github.com/leanprover-community/lean4-metaprogramming-book).
## Usage
### Rust
Add this crate as a normal dependency in your `Cargo.toml` file.
```bash
cargo add tree-sitter-lean4
```
During the first build, you need this:
- C code generator `tree-sitter` (only if the `src/parser.c` is missing)
- C compiler `cc`
Then instantiate the parser:
```rust
use tree_sitter::{InputEdit, Language, Parser, Point};
let mut parser = Parser::new();
parser.set_language(&tree_sitter_lean4::LANGUAGE.into()).expect("Error loading Rust grammar");
```
See [Tree-Sitter-Rust](https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_rust).
### Nix Flake
This is the recommended approach for reproducible builds.
```nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
tree-sitter-lean.url = "github:wvhulle/tree-sitter-lean";
};
outputs = { nixpkgs, tree-sitter-lean, ... }:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in
{
devShells.${system}.default = pkgs.mkShell {
# If you want to use ast-grep (see next section)
packages = [ pkgs.ast-grep ];
shellHook = ''
# Create a symlink in the working directory for easy access (add to .gitignore)
ln -sf ${tree-sitter-lean.packages.${system}.grammar}/parser tree-sitter-lean.so
'';
};
};
}
```
See [`nixpkgs` tree-sitter documentation](https://nixos.org/manual/nixpkgs/stable/#tree-sitter) for more Tree-Sitter with Nix examples.
Push build cache to public cache server:
```bash
## Development
Read [writing the grammar](https://tree-sitter.github.io/tree-sitter/creating-parsers/3-writing-the-grammar.html). Be careful of adding too many conflicts in the grammar as they cause exponential growth of the state space.
Use the `tree-sitter` CLI:
```bash
tree-sitter generate # Re-run this after every grammar rule change
tree-sitter parse Test.lean # A long Lean file that needs to be parsed correctly
```
Add tests for the Tree-Sitter grammar to [./test/corpus](./test/corpus).
See [writing tests](https://tree-sitter.github.io/tree-sitter/creating-parsers/5-writing-tests.html)
## License
Based on <https://github.com/Julian/lean.nvim>. Grammar was completely rewritten to be simpler.
MIT