From 0b282266150ea37f12d06893f531a2b54a74e236 Mon Sep 17 00:00:00 2001 From: June Gschwantner <57196053+lucifayr@users.noreply.github.com> Date: Thu, 6 Mar 2025 23:15:21 +0100 Subject: [PATCH] docs(bindings): Add "Using WASM Grammar files" section to `binding_rust` (#4235) --- lib/binding_rust/README.md | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/lib/binding_rust/README.md b/lib/binding_rust/README.md index 602f647b..3fb7bf5d 100644 --- a/lib/binding_rust/README.md +++ b/lib/binding_rust/README.md @@ -105,6 +105,49 @@ assert_eq!( ); ``` +## Using WASM Grammar Files + +> Requires the feature **wasm** to be enabled. + +First, create a parser with a WASM store: + +```rust +use tree_sitter::{wasmtime::Engine, Parser, WasmStore}; + +let engine = Engine::default(); +let store = WasmStore::new(&engine).unwrap(); + +let mut parser = Parser::new(); +parser.set_wasm_store(store).unwrap(); +``` + +Then, load the language from a WASM file: + +```rust +const JAVASCRIPT_GRAMMAR: &[u8] = include_bytes!("path/to/tree-sitter-javascript.wasm"); + +let mut store = WasmStore::new(&engine).unwrap(); +let javascript = store + .load_language("javascript", JAVASCRIPT_GRAMMAR) + .unwrap(); + +// The language may be loaded from a different WasmStore than the one set on +// the parser but it must use the same underlying WasmEngine. +parser.set_language(&javascript).unwrap(); +``` + +Now you can parse source code: + +```rust +let source_code = "let x = 1;"; +let tree = parser.parse(source_code, None).unwrap(); + +assert_eq!( + tree.root_node().to_sexp(), + "(program (lexical_declaration (variable_declarator name: (identifier) value: (number))))" +); +``` + [tree-sitter]: https://github.com/tree-sitter/tree-sitter ## Features