Tokenization utilities for building parsers in Rust
Buffered token channel:
rust
let mut btq = BufferedTokenQueue::new();
btq.push(Token(12, Span(0, 2)));
btq.push(Token(32, Span(2, 4)));
btq.push(Token(52, Span(4, 8)));
assert_eq!(btq.next().unwrap(), Token(12, Span(0, 2)));
assert_eq!(btq.next().unwrap(), Token(32, Span(2, 4)));
assert_eq!(btq.next().unwrap(), Token(52, Span(4, 8)));
assert_eq!(btq.next(), None);
(Multi-thread safe) Parallel token queue:
```rust let (mut sender, mut reader) = ParallelTokenQueue::new(); std::thread::spawn(move || { sender.push(Token(12, Span(0, 2))); sender.push(Token(32, Span(2, 4))); sender.push(Token(52, Span(4, 8))); });
asserteq!(reader.next().unwrap(), Token(12, Span(0, 2))); asserteq!(reader.next().unwrap(), Token(32, Span(2, 4))); asserteq!(reader.next().unwrap(), Token(52, Span(4, 8))); asserteq!(reader.next(), None); ```
Generator token queue:
```rust
fn lexer(state: &mut u8, sender: &mut GeneratorTokenQueueBuffer
let mut reader = GeneratorTokenQueue::new(lexer, 0);
asserteq!(reader.next().unwrap(), Token(2, ())); asserteq!(reader.next().unwrap(), Token(4, ())); asserteq!(reader.next().unwrap(), Token(6, ())); assert!(reader.next().isnone()); ```
Provides utilities such as peek
, peek_n
and scan
for lookahead. Also expect_next
for expecting a token value and conditional_next
for advancing on a predicate.