#lexer #token #regex #debugging #lex #string #input

reglex

使用正则表达式生成 lexer 的 Rust 库

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 日

#1686Rust 模式


用于 rs-lambda

MIT 许可证

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(&regexes, 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(&regexes, 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