34 个版本 (稳定)

12.1.0 2024 年 3 月 12 日
11.0.0 2024 年 2 月 20 日
10.0.1 2024 年 2 月 14 日
9.1.2 2024 年 2 月 13 日
0.3.1 2022 年 3 月 30 日

#128文本处理

Download history 369/week @ 2024-03-09 24/week @ 2024-03-16 1/week @ 2024-03-23 97/week @ 2024-03-30 15/week @ 2024-04-06

1,191 每月下载量

MIT 许可证

125KB
3K SLoC

jayce

jayce 是一个分词器 🌌

示例
use jayce::{Duo, Tokenizer};
use std::sync::OnceLock;

const SOURCE: &str = "Excalibur = 5000$; // Your own language!";

fn duos() -> &'static Vec<Duo<&'static str>> {
    static DUOS: OnceLock<Vec<Duo<&'static str>>> = OnceLock::new();
    DUOS.get_or_init(|| {
        vec![
            Duo::new("whitespace", r"^[^\S\n]+", false),
            Duo::new("commentLine", r"^//(.*)", false),
            Duo::new("commentBlock", r"^/\*(.|\n)*?\*/", false),
            Duo::new("newline", r"^\n", false),
            Duo::new("price", r"^[0-9]+\$", true),
            Duo::new("semicolon", r"^;", true),
            Duo::new("operator", r"^=", true),
            Duo::new("name", r"^[a-zA-Z_]+", true),
        ]
    })
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut tokenizer = Tokenizer::new(SOURCE, duos());

    while let Some(token) = tokenizer.consume()? {
        println!("{:?}", token);
    }

    Ok(())
}
结果
Token { kind: "name",      value: "Excalibur", pos: (1, 1)  }
Token { kind: "operator",  value: "=",         pos: (1, 11) }
Token { kind: "price",     value: "5000$",     pos: (1, 13) }
Token { kind: "semicolon", value: ";",         pos: (1, 18) }
信息

Tokenizer::consume 返回 Result Option Token

  1. Ok Some 匹配找到
  2. Ok None 源文件结束
  3. Err 发生错误

Tokenizer::consume_all 返回 Result Vec Token

  1. Ok Vec Token 匹配到标记
  2. Err 发生错误
性能

初始化耗时约 3 纳秒,对 Yuumi 的分词耗时约 4 毫秒

特性
  • generic-simd
  • runtime-dispatch-simd 默认启用,要禁用请修改 Cargo.toml 如下
jayce = { version = "X.X.X", default-features = false }

依赖

~2.1–3MB
~54K SLoC