#tokenization #parser #utilities

tokenizer-lib

Rust中构建解析器的标记化工具

15个版本 (稳定)

1.6.0 2024年5月21日
1.5.1 2023年9月15日
1.5.0 2023年2月9日
1.4.0 2022年11月26日
0.4.1 2021年2月22日

#34解析工具

Download history 7/week @ 2024-04-29 17/week @ 2024-05-06 16/week @ 2024-05-13 172/week @ 2024-05-20 49/week @ 2024-05-27 13/week @ 2024-06-03 12/week @ 2024-06-10 10/week @ 2024-06-17 146/week @ 2024-07-01 17/week @ 2024-07-15 136/week @ 2024-07-29 39/week @ 2024-08-05 33/week @ 2024-08-12

每月下载 209次
用于 5 个crate(2个直接使用)

MIT 许可证

32KB
656

Tokenizer-lib

Docs Crates

Rust中构建解析器的标记化工具

示例

缓冲标记通道

use tokenizer_lib::{BufferedTokenQueue, Token, TokenReader, TokenSender, TokenTrait};

#[derive(PartialEq, Debug)]
struct Span(pub u32, pub u32);

#[derive(PartialEq, Debug)]
struct N(pub u32);

impl TokenTrait for N {}

let mut btq = BufferedTokenQueue::new();
btq.push(Token(N(12), Span(0, 2)));
btq.push(Token(N(32), Span(2, 4)));
btq.push(Token(N(52), Span(4, 8)));
assert_eq!(btq.next().unwrap().0, N(12));
assert_eq!(btq.next().unwrap().0, N(32));
assert_eq!(btq.next().unwrap().0, N(52));
assert!(btq.next().is_none());

(多线程安全) 并行标记队列

use tokenizer_lib::{ParallelTokenQueue, Token, TokenReader, TokenSender, TokenTrait};

#[derive(PartialEq, Debug)]
struct Span(pub u32, pub u32);

#[derive(PartialEq, Debug)]
struct N(pub u32);

impl TokenTrait for N {}

let (mut sender, mut reader) = ParallelTokenQueue::new();
std::thread::spawn(move || {
    sender.push(Token(N(12), Span(0, 2)));
    sender.push(Token(N(32), Span(2, 4)));
    sender.push(Token(N(52), Span(4, 8)));
});

assert_eq!(reader.next().unwrap().0, N(12));
assert_eq!(reader.next().unwrap().0, N(32));
assert_eq!(reader.next().unwrap().0, N(52));
assert!(reader.next().is_none());

生成器标记队列

use tokenizer_lib::{GeneratorTokenQueue, GeneratorTokenQueueBuffer, Token, TokenReader, TokenSender, TokenTrait};

#[derive(PartialEq, Debug)]
struct N(pub u32);

impl TokenTrait for N {}

fn lexer(state: &mut u32, sender: &mut GeneratorTokenQueueBuffer<N, ()>) {
    *state += 1;
    match state {
        1..=3 => {
            sender.push(Token(N(*state * 2), ()));
        }
        _ => {}
    }
}

let mut reader = GeneratorTokenQueue::new(lexer, 0);

assert_eq!(reader.next().unwrap().0, N(2));
assert_eq!(reader.next().unwrap().0, N(4));
assert_eq!(reader.next().unwrap().0, N(6));
assert!(reader.next().is_none());

提供如 peekpeek_nscan 等前瞻工具。还包括 expect_next 用于期望标记值和 conditional_next 用于根据谓词前进。

依赖项

~240KB