#lexer #lexing #tokenizer #parser #char

char-lex

创建基于枚举的简单词法分析器

11个版本 (6个稳定版)

1.0.5 2020年5月1日
1.0.4 2020年4月30日
0.2.0 2020年4月29日
0.1.3 2020年4月29日

156解析工具

每月下载29次

MIT/Apache

10KB
182

已停止维护

请随意使用...

CHAR-LEX

Char-Lex 是一个用于轻松从多个自定义枚举创建基于 char 的词法分析器的 crate。

示例

use char_lex::prelude::*;

#[token]
#[derive(Debug, PartialEq)]
enum Token {
    Whitespace = [' ', '\t', '\r', '\n'],

    Digit(Digit),
}

#[token]
#[derive(Debug, PartialEq)]
enum Digit {
    Zero = '0',
    One = '1',
    Two = '2',
    Three = '3',
    Four = '4',
    Five = '5',
    Six = '6',
    Seven = '7',
    Eight = '8',
    Nine = '9',
}

fn main() {
    let lexer: Lexer<Token, Token> = Lexer::new("189");
    let tokens: Vec<Token> = lexer.collect();

    assert_eq!(
        vec![
            Token::Digit(Digit::One),
            Token::Digit(Digit::Eight),
            Token::Digit(Digit::Nine)
        ],
        tokens
    );
}

TokensTokenTrait 也可以被任何实现了 TokenWrapper<T> 特性的东西包装。

示例

#[derive(Debug, PartialEq)]
struct Wrapper {
    token: Token,
    character: char,
}

impl TokenWrapper<Token> for Wrapper {
    fn wrap(token: Token, context: Context) -> Self {
        Self {
            token,
            character: context.character,
        }
    }
}

fn main() {
    let lexer: Lexer<Token, Wrapper> = Lexer::new("1");
    let tokens: Vec<Wrapper> = lexer.collect();

    assert_eq!(
        vec![Wrapper {
            token: Token::Digit(Digit::One),
            character: '1'
        }],
        tokens
    );
}

依赖项

~220KB