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

Download history 88445/week @ 2024-05-04 102034/week @ 2024-05-11 90656/week @ 2024-05-18 85249/week @ 2024-05-25 105809/week @ 2024-06-01 98588/week @ 2024-06-08 98663/week @ 2024-06-15 81142/week @ 2024-06-22 74876/week @ 2024-06-29 96790/week @ 2024-07-06 83461/week @ 2024-07-13 95372/week @ 2024-07-20 101108/week @ 2024-07-27 91284/week @ 2024-08-03 100936/week @ 2024-08-10 77553/week @ 2024-08-17

391,027 个月下载量
30 仓库中使用 (直接使用 6 个)

MIT/Apache

165KB
4K SLoC

Logos logo

Logos

Test Crates.io version shield Docs Crates.io license shield

创建极其快速的词法分析器。

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

致谢

谢谢

Logos 是一项充满爱的劳动成果。如果您觉得它有用,请考虑 给我一些咖啡。☕

如果您想为 Logos 做出贡献,请考虑阅读 贡献指南

许可证

此代码根据 MIT 许可证和 Apache 许可证(版本 2.0)的条款分发,您可以选择适合您的许可证。

有关详细信息,请参阅 LICENSE-APACHELICENSE-MIT

依赖关系

~1–1.9MB
~51K SLoC