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#[derive(Debug, Copy, Clone)]
27pub struct Lexer;
28
29impl Lexer {
30 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}