1 个不稳定版本
0.1.0 | 2019 年 10 月 17 日 |
---|
#195 在 解析工具 中
10KB
228 行
🌖cursortanium
一个为 Rust 设计的坚固光标
为什么选择 cursortanium?
虽然正则表达式和 PEGs 具有声明性和优雅性,但在处理更复杂的问题时,控制起来可能很困难。
cursortanium 是一个通用解析器。它提供了命令式和程序式接口,用于与输入文档交互。这意味着您可以根据自己的方式自定义和运行解析器,而不需要依赖任何额外的语法或语法。这使得 cursortanium 与先前的库相比具有更大的功能。
示例
以下函数接受一个输入光标,然后从文档中提取可能包含转义序列的字符串值,并返回相应的值
fn parse_string(cursor: &mut Cursor) -> Option<String> {
if cursor.starts_with("\"") {
cursor.next_mut(1);
} else {
return None;
};
let mut chunks = vec![];
let mut marker = cursor.clone();
while !cursor.starts_with("\"") && !cursor.is_eof() {
if cursor.starts_with("\\") {
chunks.push(marker.take_until(&cursor));
cursor.next_mut(1);
marker = cursor.clone();
cursor.next_mut(1);
} else {
cursor.next_mut(1);
};
};
chunks.push(marker.take_until(&cursor));
if cursor.starts_with("\"") {
cursor.next_mut(1);
} else {
return None;
};
Some(chunks.concat())
}
要使用此函数,我们将创建一个在字符串开头的光标,并将其作为可变参数传递
use cursortanium::Cursor;
fn main() {
let mut cursor = Cursor::from(String::from(r#""Hello, \"World\"!"#));
if let Some(value) = parse_string(&mut cursor) {
println!("{}", cursor.is_eof())
println!("{}", value);
};
}
使用 cargo run
运行上述代码将给出以下输出
$ cargo run
true
Hello, "World"!