#tree-sitter #tree #traversal #traverse #node-tree

no-std baz-tree-sitter-traversal

使用类似TreeCursor的接口遍历tree-sitter树和任意树

2个版本

0.1.4 2024年5月20日
0.1.3 2024年5月19日

#723数据结构

每月 25 次下载

MIT 许可证

23KB
384

tree-sitter-traversal

Maintained fork of https://github.com/skmendez/tree-sitter-traversal

使用类似TreeCursor的接口遍历tree-sitter树和任意树。

build_status Documentation crates.io

使用游标,可以通过非常有效的方式遍历树,并且不会进行额外的堆分配,除了Cursor可能需要的分配。前序和后序遍历所需的状态非常少;对于前序遍历,只需要维护遍历是否完成,而对于后序遍历,我们还需要维护游标是否正在向上或向下遍历树。

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
baz-tree-sitter-traversal = "0.1.3"

示例

use tree_sitter::{Node, Tree};
use tree_sitter_traversal::{traverse, traverse_tree, Order};

fn get_tree() -> Tree {
    use tree_sitter::Parser;
    let mut parser = Parser::new();
    let lang = tree_sitter_rust::language();
    parser.set_language(&lang).expect("Error loading Rust grammar");
    return parser.parse("fn double(x: usize) -> usize { x * 2 }", None).expect("Error parsing provided code");
}

fn main() {
    use std::collections::HashSet;
    use std::iter::FromIterator;
    let tree: Tree = get_tree();
    let preorder: Vec<Node<'_>> = traverse(tree.walk(), Order::Pre).collect::<Vec<_>>();
    let postorder: Vec<Node<'_>> = traverse_tree(&tree, Order::Post).collect::<Vec<_>>();
    // For any tree with more than just a root node,
    // the order of preorder and postorder will be different
    assert_ne!(preorder, postorder);
    // However, they will have the same amount of nodes
    assert_eq!(preorder.len(), postorder.len());
    // Specifically, they will have the exact same nodes, just in a different order
    assert_eq!(
        <HashSet<_>>::from_iter(preorder.into_iter()),
        <HashSet<_>>::from_iter(postorder.into_iter())
    );   
}

功能

尽管这个库被设计用来与tree-sitter一起使用,但这种使用是可选的,因为它也可以用于实现Cursor特质的任何结构。当禁用tree-sitter功能时,实际上库是#![no_std]。要使用而不需要tree-sitter,将以下内容添加到您的Cargo.toml中

[dependencies.baz-tree-sitter-traversal]
version = "0.1.3"
default-features = false

依赖

~2.7–4MB
~72K SLoC