Skip to main content

recognizer_to_visitor/
recognizer_to_visitor.rs

1use elyze::errors::{ParseError, ParseResult};
2use elyze::matcher::Match;
3use elyze::recognizer::Recognizer;
4use elyze::scanner::Scanner;
5use elyze::visitor::Visitor;
6
7#[derive(Debug)]
8enum Operator {
9    Add,
10    Sub,
11}
12
13fn match_char(c: char, data: &[u8]) -> (bool, usize) {
14    match data.first() {
15        Some(&d) => (d == c as u8, 1),
16        None => (false, 0),
17    }
18}
19
20impl Match<u8> for Operator {
21    fn is_matching(&self, data: &[u8]) -> (bool, usize) {
22        match self {
23            Operator::Add => match_char('+', data),
24            Operator::Sub => match_char('-', data),
25        }
26    }
27
28    fn size(&self) -> usize {
29        match self {
30            Operator::Add => 1,
31            Operator::Sub => 1,
32        }
33    }
34}
35
36#[derive(Debug)]
37// Define a structure to implement the `Visitor` trait
38struct OperatorData(Operator);
39
40impl<'a> Visitor<'a, u8> for OperatorData {
41    fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
42        // Build and apply the recognizer
43        let operator = Recognizer::new(scanner)
44            .try_or(Operator::Add)?
45            .try_or(Operator::Sub)?
46            .finish()
47            // If the recognizer fails, return an error
48            .ok_or(ParseError::UnexpectedToken)?;
49
50        Ok(OperatorData(operator))
51    }
52}
53
54fn main() -> ParseResult<()> {
55    let data = b"+";
56    let mut scanner = Scanner::new(data);
57    // Initialize the recognizer
58    let result = OperatorData::accept(&mut scanner)?.0;
59    dbg!(result); // Operator::Add
60
61    let data = b"-";
62    let mut scanner = Scanner::new(data);
63    // Initialize the recognizer
64    let result = OperatorData::accept(&mut scanner)?.0;
65    dbg!(result); // Operator::Sub
66
67    let data = b"x";
68    let mut scanner = Scanner::new(data);
69    // Initialize the recognizer
70    let result = OperatorData::accept(&mut scanner);
71    assert!(matches!(result, Err(ParseError::UnexpectedToken))); // Err(UnexpectedToken)
72
73    Ok(())
74}