Skip to main content

tokens/
tokens.rs

1use elyze::errors::ParseResult;
2use elyze::matcher::Match;
3use elyze::recognizer::recognize;
4
5fn match_char(c: char, data: &[u8]) -> (bool, usize) {
6    match data.first() {
7        Some(&d) => (d == c as u8, 1),
8        None => (false, 0),
9    }
10}
11
12enum Token {
13    Plus,
14    Minus,
15    Star,
16    Slash,
17    LParen,
18    RParen,
19}
20
21impl Match<u8> for Token {
22    fn is_matching(&self, data: &[u8]) -> (bool, usize) {
23        match self {
24            Token::Plus => match_char('+', data),
25            Token::Minus => match_char('-', data),
26            Token::Star => match_char('*', data),
27            Token::Slash => match_char('/', data),
28            Token::LParen => match_char('(', data),
29            Token::RParen => match_char(')', data),
30        }
31    }
32
33    fn size(&self) -> usize {
34        match self {
35            Token::Plus => 1,
36            Token::Minus => 1,
37            Token::Star => 1,
38            Token::Slash => 1,
39            Token::LParen => 1,
40            Token::RParen => 1,
41        }
42    }
43}
44
45fn main() -> ParseResult<()> {
46    let data = b"((+-)*/)end";
47    let mut scanner = elyze::scanner::Scanner::new(data);
48    recognize(Token::LParen, &mut scanner)?;
49    recognize(Token::LParen, &mut scanner)?;
50    recognize(Token::Plus, &mut scanner)?;
51    recognize(Token::Minus, &mut scanner)?;
52    recognize(Token::RParen, &mut scanner)?;
53    recognize(Token::Star, &mut scanner)?;
54    recognize(Token::Slash, &mut scanner)?;
55    recognize(Token::RParen, &mut scanner)?;
56
57    print!("{:?}", String::from_utf8_lossy(scanner.remaining()));
58
59    Ok(())
60}