5 个版本 (稳定)
1.1.0 | 2022 年 2 月 6 日 |
---|---|
1.0.2 | 2022 年 2 月 6 日 |
1.0.1 | 2022 年 2 月 5 日 |
0.1.0 | 2022 年 2 月 5 日 |
#1686 在 Rust 模式
用于 rs-lambda
9KB
79 行
reglex
用于创建基于正则表达式的 lexer 的小型 Rust 库
示例
use reglex::{RuleList, rule_list, lex};
#[derive(Debug, PartialEq)]
enum Token {
Keyword,
Number(u64),
Left,
Right,
}
fn lexer(input: &String) -> Result<Vec<Token>, usize> {
let regexes: RuleList<Token> = rule_list! [
"kw" => |_| Some(Token::Keyword),
r"\d+" => |s: &str| Some(Token::Number(s.parse().unwrap())),
r"\{" => |_| Some(Token::Left),
r"\}" => |_| Some(Token::Right),
r"\s" => |_| None
];
lex(®exes, input)
}
fn main() {
assert_eq!(
lexer(&"kw { 12 53 }".to_string()),
Ok(vec![
Token::Keyword,
Token::Left,
Token::Number(12),
Token::Number(53),
Token::Right
])
);
assert_eq!(lexer(&"kw ERROR! { 12 53 }".to_string()), Err(3));
}
lib.rs
:
创建基于正则表达式的 lexer 的小型库
示例
use reglex::{RuleList, RuleInput, rule_list, lex};
#[derive(Debug, PartialEq)]
enum Token {
Keyword,
Number(u64),
Hashtag(String),
Left,
Right,
}
fn lexer(input: &str) -> Result<Vec<Token>, usize> {
let regexes: RuleList<Token> = rule_list! [
r"kw" => |_| Some(Token::Keyword),
r"\d+" => |s: RuleInput| Some(Token::Number(s[0].parse().unwrap())),
r"\{" => |_| Some(Token::Left),
r"\}" => |_| Some(Token::Right),
r"#([a-z]+)" => |s: RuleInput| Some(Token::Hashtag(s[1].to_string())),
r"\s" => |_| None,
];
lex(®exes, input)
}
fn main() {
assert_eq!(
lexer("kw { 12 #hello 53 }"),
Ok(vec![
Token::Keyword,
Token::Left,
Token::Number(12),
Token::Hashtag("hello".to_string()),
Token::Number(53),
Token::Right,
])
);
assert_eq!(lexer("kw ERROR! { 12 #hello 53 }"), Err(3));
}
依赖
~2.1–3MB
~53K SLoC