#枚举 #标记 #词法分析器 #词法 #derive-debug #char-lex

char-lex-macro

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

8个版本 (3个稳定版)

1.0.2 2020年5月1日
1.0.1 2020年4月30日
0.2.0 2020年4月29日
0.1.3 2020年4月29日

#21 in #lex


char-lex 中使用

MIT/Apache

7KB
152

已停止开发

请随意使用...

CHAR-LEX

Char-Lex 是一个库,用于轻松地从多个自定义枚举中创建基于 char 的词法分析器!

示例

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
    );
}

具有 TokenTraitTokens 也可以被包装在任何实现 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
    );
}

依赖项

~1.5MB
~32K SLoC