Skip to main content

addition/
addition.rs

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
9/// The token number which recognizes numbers.
10struct TokenNumber;
11
12/// Implement the `Match` trait for the token number.
13impl 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
23/// Define how to accept the token number.
24struct Number(usize);
25
26/// Implement the `Visitor` trait for the token number.
27impl 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/// Define the addition expression.
37#[derive(Debug)]
38#[allow(dead_code)]
39struct Addition {
40    rhs: usize,
41    lhs: usize,
42    result: usize,
43}
44
45/// Implement the `Visitor` trait for the addition expression.
46impl<'a> Visitor<'a, u8> for Addition {
47    fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
48        // Parse the first number
49        let lhs = Number::accept(scanner)?.0;
50        // Expect a whitespace and a plus token then whitespace
51        Token::Whitespace.recognize(scanner)?;
52        Token::Plus.recognize(scanner)?;
53        Token::Whitespace.recognize(scanner)?;
54        // Parse the second number
55        let rhs = Number::accept(scanner)?.0;
56        // Expect a whitespace and an equal token then whitespace
57        Token::Whitespace.recognize(scanner)?;
58        Token::Equal.recognize(scanner)?;
59        Token::Whitespace.recognize(scanner)?;
60        // Parse the result number
61        let result = Number::accept(scanner)?.0;
62        // Return the addition
63        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}