c_lexer_logos/
lib.rs

1use logos::Logos;
2
3use self::token::Token;
4
5pub mod token;
6pub mod error;
7
8fn parse(input: &str) -> Result<Vec<Token>, error::Error> {
9    let mut lex = Token::lexer(input);
10    let mut result = vec![];
11
12    while let Some(maybe_tok) = lex.next() {
13        match maybe_tok {
14            Ok(tok) => {
15                result.push(tok);
16            }
17            Err(_err) => {
18                return Err(error::Error::LexingIncomplete);
19            }
20        }
21    }
22    Ok(result)
23}
24
25/// Lexer implementation
26#[derive(Debug, Copy, Clone)]
27pub struct Lexer;
28
29impl Lexer {
30    /// Transform string to stream of tokens
31    pub fn lex(input: &str) -> Result<Vec<Token>, error::Error> {
32        let mut tokens = parse(input)?;
33        tokens.push(Token::EOF);
34        Ok(tokens)
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use crate::token::Number;
41
42    use super::*;
43
44    #[test]
45    fn it_works() {
46        let result = Lexer::lex("sizeof(123) != 32");
47        assert_eq!(result, Ok(vec![Token::SIZEOF, Token::LParen, Token::NumericLiteral(Number::new(123, 0, 0, 10)), Token::RParen, Token::NeOp, Token::NumericLiteral(Number::new(32, 0, 0, 10)), Token::EOF]));
48    }
49}