1 个不稳定版本
0.2.0 | 2024年6月4日 |
---|
#131 在 解析器工具 中
在 3 个 crate(2 个直接) 中使用
24KB
253 行
流解析器
一个用于从迭代器中解析数据的简单库。
lib.rs
:
一个用于解析数据流的简单库。
解析分为两个任务
- 将迭代器分割成标记。这通过一个
Lexer
完成。 - 处理标记:`Tokenized` 结构提供了处理标记流的辅助函数。
示例
use itertools::{Itertools, PeekingNext};
use libreda_stream_parser::*;
struct ArrayLexer {}
impl Lexer for ArrayLexer {
type Char = char;
fn consume_next_token(
&mut self,
input: &mut (impl Iterator<Item = Self::Char> + PeekingNext),
mut output: impl FnMut(Self::Char),
) -> Result<(), ParserError<char>> {
// Skip whitespace.
let _n = input.peeking_take_while(|c| c.is_whitespace()).count();
let is_terminal_char = |c: char| -> bool {
let terminals = "[],";
c.is_whitespace() || terminals.contains(c)
};
if let Some(c) = input.next() {
output(c);
// Continue reading token if `c` was no terminal character.
if !is_terminal_char(c) {
input
.peeking_take_while(|&c| !is_terminal_char(c))
.for_each(output);
}
}
Ok(())
}
}
/// Parse an array of the form `[1.0, 2, 3.1324]`.
fn parse_array(data: &str) -> Result<Vec<f64>, ParserError<char>> {
let mut tk = tokenize(data.chars(), ArrayLexer {});
tk.advance()?;
let mut arr: Vec<f64> = vec![];
tk.expect_str("[")?;
loop {
if tk.test_str("]")? {
break;
}
let num = tk.take_and_parse()?;
arr.push(num);
tk.expect_str(",")?;
}
Ok(arr)
}
let data = r#"
[
1.23,
2.34,
3.456,
]
"#;
let arr = parse_array(data).expect("parsing failed");
assert_eq!(arr, vec![1.23, 2.34, 3.456]);
依赖关系
~460KB