Rust语法分析工具tree-sitter-cli的使用,tree-sitter-cli提供高效解析和生成语法树的命令行工具

Rust语法分析工具tree-sitter-cli的使用,tree-sitter-cli提供高效解析和生成语法树的命令行工具

Tree-sitter CLI

crates.io badge npmjs.com badge

Tree-sitter CLI是一个命令行工具,允许您开发、测试和使用Tree-sitter语法。它支持MacOSLinuxWindows操作系统。

安装

您可以使用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

下面是一个完整的自定义语法开发流程示例:

  1. 首先安装工具:
cargo install --locked tree-sitter-cli
  1. 创建项目目录并初始化:
mkdir my-language
cd my-language
tree-sitter init-config
  1. 编辑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')
  }
});
  1. 生成解析器:
tree-sitter generate
  1. 创建测试用例:
mkdir corpus
echo "123 \"hello\" true" > corpus/test.txt
  1. 运行测试:
tree-sitter test
  1. 解析示例文件:
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.jscorpus测试文件的目录中运行。

2. 生成解析器代码

tree-sitter generate

这会根据grammar.js生成Rust解析器代码。

3. 构建WebAssembly版本

tree-sitter build-wasm

示例:解析Rust代码

  1. 首先创建一个简单的Rust文件example.rs:
fn main() {
    println!("Hello, world!");
}
  1. 使用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])))))

创建自定义语法

  1. 初始化新语法项目:
tree-sitter init-config my-language
cd my-language
  1. 编辑grammar.js定义语法规则
  2. 生成解析器:
tree-sitter generate
  1. 测试语法:
tree-sitter test

性能分析

tree-sitter parse --quiet --time file.rs

这会显示解析时间和内存使用情况。

完整示例

下面是一个完整的tree-sitter-cli使用示例,展示如何从安装到解析代码的完整流程:

  1. 首先安装tree-sitter-cli:
# 使用cargo安装
cargo install tree-sitter-cli

# 或者使用npm安装
npm install -g tree-sitter-cli
  1. 创建一个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);
}
  1. 使用tree-sitter解析代码:
tree-sitter parse demo.rs
  1. 预期输出示例:
(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])))))))
  1. 生成语法树图形化表示:
tree-sitter parse demo.rs --dot | dot -Tpng > demo_tree.png

总结

tree-sitter-cli 提供了强大的工具链来处理语法分析和语法树操作,特别适合:

  • 开发编辑器/IDE插件
  • 构建代码分析工具
  • 实现自定义语言支持
  • 研究编程语言语法结构

它的增量解析特性使得它在处理大型代码库时特别高效。

回到顶部