Rust语法分析工具tree-sitter-cli的使用,tree-sitter-cli提供高效解析和生成语法树的命令行工具
Rust语法分析工具tree-sitter-cli的使用,tree-sitter-cli提供高效解析和生成语法树的命令行工具
Tree-sitter CLI
Tree-sitter CLI是一个命令行工具,允许您开发、测试和使用Tree-sitter语法。它支持MacOS
、Linux
和Windows
操作系统。
安装
您可以使用Rust的包管理器cargo
安装tree-sitter-cli
:
cargo install --locked tree-sitter-cli
或者使用Node的包管理器npm
安装:
npm install tree-sitter-cli
也可以从发布页面下载适用于您平台的预构建二进制文件。
依赖项
tree-sitter
二进制文件本身没有依赖项,但某些特定功能需要以下依赖:
- 生成解析器需要安装
node
并添加到PATH环境变量 - 运行和测试解析器需要系统安装C和C++编译器
主要命令
generate
- 根据当前目录的语法定义生成解析器test
- 运行当前解析器的单元测试parse
- 使用解析器分析文件或文件列表
示例代码
示例1:基本安装和使用
// 安装CLI工具
cargo install --locked tree-sitter-cli
// 初始化新语法项目配置
tree-sitter init-config
// 生成解析器
tree-sitter generate
// 运行测试
tree-sitter test
示例2:代码解析功能
// 解析Rust源代码文件
tree-sitter parse src/main.rs
// 显示详细的语法树结构
tree-sitter parse src/main.rs --debug
// 以JSON格式输出语法树
tree-sitter parse src/main.rs --json
示例3:自定义语法开发
// 1. 定义语法规则文件grammar.js
// 2. 生成解析器代码
tree-sitter generate
// 3. 创建测试用例文件corpus/test.txt
// 4. 执行测试验证
tree-sitter test
// 5. 使用新解析器分析代码
tree-sitter parse --debug sample.code
完整示例demo
下面是一个完整的自定义语法开发流程示例:
- 首先安装工具:
cargo install --locked tree-sitter-cli
- 创建项目目录并初始化:
mkdir my-language
cd my-language
tree-sitter init-config
- 编辑grammar.js定义语法规则:
module.exports = grammar({
name: 'my_language',
rules: {
source_file: $ => repeat($.item),
item: $ => choice(
$.number,
$.string,
$.boolean
),
number: $ => /[0-9]+/,
string: $ => /"[^"]*"/,
boolean: $ => choice('true', 'false')
}
});
- 生成解析器:
tree-sitter generate
- 创建测试用例:
mkdir corpus
echo "123 \"hello\" true" > corpus/test.txt
- 运行测试:
tree-sitter test
- 解析示例文件:
echo "42 false \"world\"" > test.my
tree-sitter parse test.my --debug
技术规格
- 当前版本: v1.82.0
- 开源协议: MIT
- 包大小: 157 KiB
作为库使用
在Rust项目中添加依赖:
cargo add tree-sitter-cli
或在Cargo.toml中添加:
tree-sitter-cli = "0.25.8"
1 回复
Rust语法分析工具tree-sitter-cli的使用指南
简介
tree-sitter-cli 是一个高效的语法解析工具命令行界面,它使用Rust编写,能够快速解析源代码并生成语法树。Tree-sitter 是一个增量解析系统,支持多种编程语言,特别适合编辑器、IDE等需要实时语法分析的应用场景。
安装方法
通过Cargo安装
cargo install tree-sitter-cli
通过npm安装
npm install -g tree-sitter-cli
基本使用方法
1. 解析源代码文件
tree-sitter parse file.rs
这会输出文件的语法树结构。
2. 高亮显示语法树
tree-sitter highlight file.rs
3. 生成语法树图形化表示
tree-sitter parse file.rs --dot | dot -Tpng > tree.png
需要先安装Graphviz的dot
工具。
高级功能
1. 测试语法规则
tree-sitter test
在包含grammar.js
和corpus
测试文件的目录中运行。
2. 生成解析器代码
tree-sitter generate
这会根据grammar.js
生成Rust解析器代码。
3. 构建WebAssembly版本
tree-sitter build-wasm
示例:解析Rust代码
- 首先创建一个简单的Rust文件
example.rs
:
fn main() {
println!("Hello, world!");
}
- 使用tree-sitter解析:
tree-sitter parse example.rs
输出示例:
(source_file [0, 0] - [2, 1]
(function_item [0, 0] - [1, 2]
name: (identifier [0, 3] - [0, 7])
parameters: (parameters [0, 7] - [0, 9])
body: (block [0, 10] - [1, 2]
(macro_invocation [1, 4] - [1, 22]
macro: (identifier [1, 4] - [1, 11])
(token_tree [1, 11] - [1, 22]
(string_literal [1, 12] - [1, 21])))))
创建自定义语法
- 初始化新语法项目:
tree-sitter init-config my-language
cd my-language
- 编辑
grammar.js
定义语法规则 - 生成解析器:
tree-sitter generate
- 测试语法:
tree-sitter test
性能分析
tree-sitter parse --quiet --time file.rs
这会显示解析时间和内存使用情况。
完整示例
下面是一个完整的tree-sitter-cli使用示例,展示如何从安装到解析代码的完整流程:
- 首先安装tree-sitter-cli:
# 使用cargo安装
cargo install tree-sitter-cli
# 或者使用npm安装
npm install -g tree-sitter-cli
- 创建一个Rust示例文件
demo.rs
:
// 定义一个结构体
struct Point {
x: i32,
y: i32,
}
// 实现结构体方法
impl Point {
fn new(x: i32, y: i32) -> Self {
Self { x, y }
}
}
fn main() {
let p = Point::new(1, 2);
println!("Point is at ({}, {})", p.x, p.y);
}
- 使用tree-sitter解析代码:
tree-sitter parse demo.rs
- 预期输出示例:
(source_file [0, 0] - [13, 1]
(struct_item [0, 0] - [3, 2]
name: (identifier [0, 7] - [0, 12])
(field_declaration_list [0, 13] - [3, 1]
(field_declaration [1, 4] - [1, 10]
name: (identifier [1, 4] - [1, 5])
type: (primitive_type [1, 7] - [1, 10]))
(field_declaration [2, 4] - [2, 10]
name: (identifier [2, 4] - [2, 5])
type: (primitive_type [2, 7] - [2, 10]))))
(impl_item [5, 0] - [9, 2]
(type_identifier [5, 5] - [5, 10])
(declaration_list [5, 11] - [9, 1]
(function_item [6, 4] - [8, 6]
name: (identifier [6, 7] - [6, 10])
parameters: (parameters [6, 10] - [6, 20]
(parameter [6, 11] - [6, 15]
pattern: (identifier [6, 11] - [6, 12])
type: (primitive_type [6, 14] - [6, 17]))
(parameter [6, 17] - [6, 19]
pattern: (identifier [6, 17] - [6, 18])
type: (primitive_type [6, 20] - [6, 23])))
return_type: (type_identifier [6, 25] - [6, 29])
body: (block [6, 30] - [8, 5]
(return_expression [7, 8] - [7, 21]
(struct_expression [7, 15] - [7, 21]
type: (type_identifier [7, 15] - [7, 20])
(field_initializer_list [7, 21] - [7, 21]
(identifier [7, 21] - [7, 22])
(identifier [7, 24] - [7, 25]))))))))
(function_item [11, 0] - [12, 2]
name: (identifier [11, 3] - [11, 7])
parameters: (parameters [11, 7] - [11, 9])
body: (block [11, 10] - [12, 2]
(let_declaration [12, 4] - [12, 24]
pattern: (identifier [12, 8] - [12, 9])
value: (call_expression [12, 12] - [12, 24]
function: (field_expression [12, 12] - [12, 20]
value: (type_identifier [12, 12] - [12, 17])
field: (identifier [12, 18] - [12, 20]))
arguments: (arguments [12, 20] - [12, 24]
(integer_literal [12, 21] - [12, 22])
(integer_literal [12, 23] - [12, 24]))))
(expression_statement [12, 4] - [12, 47]
(macro_invocation [12, 4] - [12, 47]
macro: (identifier [12, 4] - [12, 11])
(token_tree [12, 11] - [12, 47]
(string_literal [12, 12] - [12, 34])
(identifier [12, 36] - [12, 37])
(identifier [12, 39] - [12, 40])
(identifier [12, 42] - [12, 43])
(identifier [12, 45] - [12, 46])))))))
- 生成语法树图形化表示:
tree-sitter parse demo.rs --dot | dot -Tpng > demo_tree.png
总结
tree-sitter-cli 提供了强大的工具链来处理语法分析和语法树操作,特别适合:
- 开发编辑器/IDE插件
- 构建代码分析工具
- 实现自定义语言支持
- 研究编程语言语法结构
它的增量解析特性使得它在处理大型代码库时特别高效。