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