recognizer_to_visitor/
recognizer_to_visitor.rs1use 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)]
37struct OperatorData(Operator);
39
40impl<'a> Visitor<'a, u8> for OperatorData {
41 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
42 let operator = Recognizer::new(scanner)
44 .try_or(Operator::Add)?
45 .try_or(Operator::Sub)?
46 .finish()
47 .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 let result = OperatorData::accept(&mut scanner)?.0;
59 dbg!(result); let data = b"-";
62 let mut scanner = Scanner::new(data);
63 let result = OperatorData::accept(&mut scanner)?.0;
65 dbg!(result); let data = b"x";
68 let mut scanner = Scanner::new(data);
69 let result = OperatorData::accept(&mut scanner);
71 assert!(matches!(result, Err(ParseError::UnexpectedToken))); Ok(())
74}