1use elyze::bytes::matchers::match_number;
2use elyze::bytes::token::Token;
3use elyze::errors::ParseResult;
4use elyze::matcher::Match;
5use elyze::recognizer::{recognize_slice, Recognizable};
6use elyze::scanner::Scanner;
7use elyze::visitor::Visitor;
8
9struct TokenNumber;
11
12impl Match<u8> for TokenNumber {
14 fn is_matching(&self, data: &[u8]) -> (bool, usize) {
15 match_number(data)
16 }
17
18 fn size(&self) -> usize {
19 0
20 }
21}
22
23struct Number(usize);
25
26impl Visitor<'_, u8> for Number {
28 fn accept(scanner: &mut Scanner<u8>) -> ParseResult<Self> {
29 let raw_data = recognize_slice(TokenNumber, scanner)?;
30 let str_data = std::str::from_utf8(raw_data)?;
31 let result = str_data.parse::<usize>()?;
32 Ok(Number(result))
33 }
34}
35
36#[derive(Debug)]
38#[allow(dead_code)]
39struct Addition {
40 rhs: usize,
41 lhs: usize,
42 result: usize,
43}
44
45impl<'a> Visitor<'a, u8> for Addition {
47 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
48 let lhs = Number::accept(scanner)?.0;
50 Token::Whitespace.recognize(scanner)?;
52 Token::Plus.recognize(scanner)?;
53 Token::Whitespace.recognize(scanner)?;
54 let rhs = Number::accept(scanner)?.0;
56 Token::Whitespace.recognize(scanner)?;
58 Token::Equal.recognize(scanner)?;
59 Token::Whitespace.recognize(scanner)?;
60 let result = Number::accept(scanner)?.0;
62 Ok(Addition { lhs, rhs, result })
64 }
65}
66
67fn main() {
68 let data = b"1 + 2 = 3";
69 let mut scanner = Scanner::new(data);
70 let result = Addition::accept(&mut scanner);
71 println!("{:?}", result);
72}