klex 0.1.2

A simple lexer (tokenizer) generator for Rust
Documentation
// Test lexer with context-dependent rules

%%
[a-zA-Z_][a-zA-Z0-9_]* -> Id
[0-9]+ -> Number
\+ -> Plus
\- -> Minus
[ \t]+ -> Whitespace
\n -> Newline
%Id [0-9]+ -> IdNumber
%Plus [0-9]+ -> PositiveNumber
%%
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_context_dependent_lexer() {
        let input = "var 123 +456 -789";
        let mut lexer = Lexer::from_str(input);
        
        // First token: IDENTIFIER
        let token = lexer.next_token().unwrap();
        println!("Token 1: kind={:?}, value='{}'", token.kind, token.text);
        assert_eq!(token.kind, TokenKind::Id);
        assert_eq!(token.text, "var");
        
        // Second token: WHITESPACE
        let token = lexer.next_token().unwrap();
        println!("Token 2: kind={:?}, value='{}'", token.kind, token.text);
        assert_eq!(token.kind, TokenKind::Whitespace);
        
        // Third token: NUMBER or IdNumber (depending on context implementation)
        let token = lexer.next_token().unwrap();
        println!("Token 3: kind={:?}, value='{}'", token.kind, token.text);
        // Context rules may or may not be implemented yet
        assert!(token.kind == TokenKind::Number || token.kind == TokenKind::IdNumber);
        assert_eq!(token.text, "123");
        
        // Fourth token: WHITESPACE
        let token = lexer.next_token().unwrap();
        println!("Token 4: kind={:?}, value='{}'", token.kind, token.text);
        assert_eq!(token.kind, TokenKind::Whitespace);
        
        // Fifth token: PLUS
        let token = lexer.next_token().unwrap();
        println!("Token 5: kind={:?}, value='{}'", token.kind, token.text);
        assert_eq!(token.kind, TokenKind::Plus);
        assert_eq!(token.text, "+");
        
        // Sixth token: NUMBER or PositiveNumber (depending on context implementation)
        let token = lexer.next_token().unwrap();
        println!("Token 6: kind={:?}, value='{}'", token.kind, token.text);
        // Context rules may or may not be implemented yet
        assert!(token.kind == TokenKind::Number || token.kind == TokenKind::PositiveNumber);
        assert_eq!(token.text, "456");
    }
}