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 在 文本处理
1,191 每月下载量
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
Ok Some
匹配找到Ok None
源文件结束Err
发生错误
Tokenizer::consume_all
返回 Result Vec Token
Ok Vec Token
匹配到标记Err
发生错误
性能
初始化耗时约 3 纳秒
,对 Yuumi 的分词耗时约 4 毫秒
特性
generic-simd
runtime-dispatch-simd
默认启用,要禁用请修改Cargo.toml
如下
jayce = { version = "X.X.X", default-features = false }
依赖
~2.1–3MB
~54K SLoC