1 个不稳定版本

0.1.0 2024年1月25日

#1023Rust 模式

MIT 许可证

5KB

Lexi-Matic

一个类似于 logos 的词法分析器 proc-macro。底层使用 regex-automata DFA。

# use lexi_matic::Lexer;
#[derive(Debug, Lexer, PartialEq, Eq)]
#[lexer(skip = "//[^\n]*\n", skip = r"[ \t\r\n\f]+")]
enum Token<'a> {
    #[token("import")]
    Import,
    #[token(";")]
    Semi,
    #[regex("[a-zA-Z_][a-zA-Z0-9_]*")]
    Ident(&'a str),
}

// An iterator of Result<(usize, Token, usize), lexi_matic::Error>.
let tokens = Token::lex("import foo_bar;import import1;// ...\nimport buz;");
for t in tokens {
    let (start, t, end) = t.unwrap();
    println!("{start}..{end} {t:?}");
}

标记歧义消除

只有两条简单的规则

  • 匹配长度总是获胜。
  • 如果多个模式匹配最长匹配,则第一个模式获胜。

因此,如果您有关键字和标识符,请首先指定关键字

# use lexi_matic::Lexer;
#[derive(Lexer)]
enum Token<'a> {
    #[token("import")]
    Import,
    #[regex("[a-zA-Z_][a-zA-Z0-9_]*")]
    Ident(&'a str),
}

因此 import 将是 Import,但 import1 将是 Ident

依赖关系

~2.2–3.5MB
~69K SLoC