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}