1 个不稳定版本
0.1.0 | 2024年1月25日 |
---|
#1023 在 Rust 模式
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