char-lex 1.0.5

Create easy enum based lexers
Documentation

CHAR-LEX

Char-Lex is a crate for easely creating a char based lexer from multiple custom enums!

Example

use char_lex::prelude::*;

#[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<Digit, Digit> = Lexer::new("189");
    let tokens: Vec<Digit> = lexer.collect();
    
    assert_eq!(vec![Digit::One, Digit::Eight, Digit::Nine], tokens);
}

Tokens can also be wrapped in anything that implements the TokenWrapper<T> trait!

Example

use char_lex::prelude::*;

#[token]
#[derive(Debug, PartialEq)]
enum Token {
    One = '1',
}

#[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::One, character: '1' }], tokens);
}