Rust Sitter:用Tree Sitter在Rust中轻松构建高效解析器的终极指南

发布时间:2026/8/3 21:24:53
Rust Sitter:用Tree Sitter在Rust中轻松构建高效解析器的终极指南 Rust Sitter用Tree Sitter在Rust中轻松构建高效解析器的终极指南【免费下载链接】rust-sitterUse Tree Sitter to parse your own languages in Rust项目地址: https://gitcode.com/gh_mirrors/ru/rust-sitterRust Sitter 是一个强大的工具它能让开发者在 Rust 中轻松创建高效解析器其核心是借助 Tree Sitter 解析器生成器。通过 Rust Sitter你只需在惯用的 Rust 代码上添加注解来定义整个语法宏就会为你生成解析器和类型安全的绑定 快速安装步骤要开始使用 Rust Sitter首先需要在Cargo.toml中添加相关依赖[dependencies] rust-sitter 0.4.5 [build-dependencies] rust-sitter-tool 0.4.5注意默认情况下Rust Sitter 使用 Tree Sitter 的一个分支该分支具有纯 Rust 运行时以支持wasm32-unknown-unknown。如果要使用标准 C 运行时请禁用默认功能并启用tree-sitter-standard功能。接下来配置build.rs来编译和链接生成的 Tree Sitter 解析器use std::path::PathBuf; fn main() { println!(cargo:rerun-if-changedsrc); rust_sitter_tool::build_parsers(PathBuf::from(src/main.rs)); } 定义语法的简单方法Rust Sitter 语法是在带注解的 Rust 模块中定义的。下面以一个简单的算术表达式解析器为例展示如何定义语法。首先定义包含语法的模块#[rust_sitter::grammar(arithmetic)] mod grammar { }然后在模块内部定义 AST 节点。我们将定义一个可用于数学表达式的枚举并使用#[rust_sitter::language]注解将其标记为根 AST 类型#[rust_sitter::language] pub enum Expr { Number(u32), Add(BoxExpr, BoxExpr) }对于Number变体使用rust_sitter::leaf注解通过正则表达式匹配数字并定义将匹配的字符串转换为u32的转换函数Number( #[rust_sitter::leaf(pattern r\d, transform |v| v.parse().unwrap())] u32, )对于Add变体需要在两个子表达式之间匹配号。使用text参数指定匹配的字符串由于我们解析为()因此不需要提供转换函数#[rust_sitter::prec_left(1)] Add( BoxExpr, #[rust_sitter::leaf(text )] (), BoxExpr, )小贴士#[rust_sitter::prec_left(1)]注解用于指定左结合性解决类似1 2 3的表达式解析歧义确保解析为(1 2) 3。完整的语法如下#[rust_sitter::grammar(arithmetic)] mod grammar { #[rust_sitter::language] pub enum Expr { Number( #[rust_sitter::leaf(pattern r\d, transform |v| v.parse().unwrap())] u32, ), #[rust_sitter::prec_left(1)] Add( BoxExpr, #[rust_sitter::leaf(text )] (), BoxExpr, ) } }✨ 轻松解析文本定义好语法后就可以使用它来解析文本了dbg!(grammar::parse(123)); /* grammar::parse(123) Ok(Add( Add( Number( 1, ), (), Number( 2, ), ), (), Number( 3, ), )) */ 核心类型注解与字段注解类型注解#[rust_sitter::language]标记解析的入口点确定从解析返回的 AST 类型。一个语法中只能有一个类型被标记为入口点。#[rust_sitter::language] struct Code { ... }#[rust_sitter::extra]标记一个节点为额外节点在解析时可以安全跳过适用于处理空格、换行和注释等。#[rust_sitter::extra] struct Whitespace { #[rust_sitter::leaf(pattern r\s)] _whitespace: (), }字段注解#[rust_sitter::leaf(...)]用于定义 AST 中的叶节点可通过pattern参数指定正则表达式或text参数指定字符串来匹配文本transform参数用于将匹配的文本转换为所需类型。#[rust_sitter::leaf(text 9)] struct BigDigit; enum SmallDigit { #[rust_sitter::leaf(text 0)] Zero, #[rust_sitter::leaf(text 1)] One, }#[rust_sitter::prec(...)]/#[rust_sitter::prec_left(...)]/#[rust_sitter::prec_right(...)]用于定义非关联、左关联或右关联运算符参数为运算符的优先级值越高绑定越紧密。#[rust_sitter::skip(...)]定义不对应输入字符串中任何内容的字段参数为运行时用于填充该字段的值。#[rust_sitter::word]将字段标记为 Tree Sitter 关键字在处理涉及关键字的错误时很有用一个语法中只能有一个字段被标记为 word。 特殊类型助力复杂语法VecT用于解析重复结构可通过#[rust_sitter::delimited(...)]指定元素间的分隔符通过#[rust_sitter::repeat(...)]指定额外配置如non_empty true要求列表至少包含一个元素。pub struct CommaSeparatedExprs { #[rust_sitter::repeat(non_empty true)] #[rust_sitter::delimited( #[rust_sitter::leaf(text ,)] () )] numbers: VecExpr, }OptionT用于解析可选结构可解析单个T或什么都不解析。pub struct CommaSeparatedExprs { #[rust_sitter::repeat(non_empty true)] #[rust_sitter::delimited( #[rust_sitter::leaf(text ,)] () )] numbers: VecOptionExpr, }rust_sitter::SpannedT用于捕获解析节点对应的文本范围包含底层解析的T以及对应子字符串的起始包含和结束不包含索引。pub struct CommaSeparatedExprs { #[rust_sitter::repeat(non_empty true)] #[rust_sitter::delimited( #[rust_sitter::leaf(text ,)] () )] numbers: VecOptionSpannedExpr, }BoxT在解析时会自动围绕内部类型构建除此之外 Rust Sitter 不会做其他额外处理。 调试技巧要查看生成的语法可以将RUST_SITTER_EMIT_ARTIFACTS环境变量设置为true。生成的语法将被写入 cargo 设置的OUT_DIR通常是target/debug/build/crate-hash/out。 开始使用 Rust Sitter现在你已经了解了 Rust Sitter 的基本用法赶快尝试使用它来构建自己的解析器吧可以通过以下命令克隆仓库开始探索git clone https://gitcode.com/gh_mirrors/ru/rust-sitterRust Sitter 让在 Rust 中构建解析器变得前所未有的简单无论是用于构建编译器、静态分析工具还是其他需要解析文本的应用它都能为你提供强大的支持。【免费下载链接】rust-sitterUse Tree Sitter to parse your own languages in Rust项目地址: https://gitcode.com/gh_mirrors/ru/rust-sitter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考