#tree-traversal #tree-sitter #tree #traversal #traverse #node-tree #heap-allocation

no-std tree-sitter-traversal

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

3 个版本

0.1.2 2021 年 12 月 30 日
0.1.1 2021 年 12 月 30 日
0.1.0 2021 年 12 月 30 日

#729 in 数据结构

Download history 592/week @ 2024-03-29 1118/week @ 2024-04-05 663/week @ 2024-04-12 445/week @ 2024-04-19 626/week @ 2024-04-26 559/week @ 2024-05-03 529/week @ 2024-05-10 588/week @ 2024-05-17 514/week @ 2024-05-24 436/week @ 2024-05-31 364/week @ 2024-06-07 378/week @ 2024-06-14 407/week @ 2024-06-21 395/week @ 2024-06-28 690/week @ 2024-07-05 423/week @ 2024-07-12

1,956 每月下载
22 个 crate 中使用 (3 个直接使用)

MIT 许可证

22KB
345

tree-sitter-traversal

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

build_status Documentation crates.io

使用游标,可以非常高效地遍历树,无需进行额外的堆分配(除了游标可能需要的)。前序和后序遍历所需的状态非常少;对于前序遍历,只需要维护遍历是否完成,对于后序遍历,我们还需要维护游标当前是否在树中向上或向下遍历。

使用方法

将此内容添加到您的 Cargo.toml

[dependencies]
tree-sitter-traversal = "0.1.2"

示例

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.tree-sitter-traversal]
version = "0.1.2"
default-features = false

依赖关系

~2.8–4MB
~72K SLoC