#cursor #parser #solid #imperative

cursortanium

一个为 Rust 设计的坚固光标

1 个不稳定版本

0.1.0 2019 年 10 月 17 日

#195解析工具

MIT 许可证

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"!

许可证

MIT 许可证

无运行时依赖