43 个版本
0.14.1 | 2024 年 8 月 2 日 |
---|---|
0.14.0 | 2024 年 2 月 7 日 |
0.13.0 | 2023 年 4 月 10 日 |
0.12.1 | 2022 年 6 月 8 日 |
0.7.3 | 2018 年 11 月 30 日 |
#27 in #lexical
391,027 个月下载量
在 30 个 仓库中使用 (直接使用 6 个)
165KB
4K SLoC
Logos
创建极其快速的词法分析器。
Logos 有两个目标
- 使其易于创建词法分析器,这样您可以专注于更复杂的问题。
- 使生成的词法分析器比您手动编写的任何内容都要快。
为了实现这些目标,Logos
示例
use logos::Logos;
#[derive(Logos, Debug, PartialEq)]
#[logos(skip r"[ \t\n\f]+")] // Ignore this regex pattern between tokens
enum Token {
// Tokens can be literal strings, of any length.
#[token("fast")]
Fast,
#[token(".")]
Period,
// Or regular expressions.
#[regex("[a-zA-Z]+")]
Text,
}
fn main() {
let mut lex = Token::lexer("Create ridiculously fast Lexers.");
assert_eq!(lex.next(), Some(Ok(Token::Text)));
assert_eq!(lex.span(), 0..6);
assert_eq!(lex.slice(), "Create");
assert_eq!(lex.next(), Some(Ok(Token::Text)));
assert_eq!(lex.span(), 7..19);
assert_eq!(lex.slice(), "ridiculously");
assert_eq!(lex.next(), Some(Ok(Token::Fast)));
assert_eq!(lex.span(), 20..24);
assert_eq!(lex.slice(), "fast");
assert_eq!(lex.next(), Some(Ok(Token::Text)));
assert_eq!(lex.slice(), "Lexers");
assert_eq!(lex.span(), 25..31);
assert_eq!(lex.next(), Some(Ok(Token::Period)));
assert_eq!(lex.span(), 31..32);
assert_eq!(lex.slice(), ".");
assert_eq!(lex.next(), None);
}
有关更多示例和文档,请参阅 Logos 手册 或 crate 文档。
有多快?
极其快速!
test identifiers ... bench: 647 ns/iter (+/- 27) = 1204 MB/s
test keywords_operators_and_punctators ... bench: 2,054 ns/iter (+/- 78) = 1037 MB/s
test strings ... bench: 553 ns/iter (+/- 34) = 1575 MB/s
致谢
- Pedrors 为 Logos 标志。
谢谢
Logos 是一项充满爱的劳动成果。如果您觉得它有用,请考虑 给我一些咖啡。☕
如果您想为 Logos 做出贡献,请考虑阅读 贡献指南。
许可证
此代码根据 MIT 许可证和 Apache 许可证(版本 2.0)的条款分发,您可以选择适合您的许可证。
有关详细信息,请参阅 LICENSE-APACHE 和 LICENSE-MIT。
依赖关系
~1–1.9MB
~51K SLoC