pub struct Recognizer<'a, 'container, T, U> { /* private fields */ }Expand description
A Recognizer is a type that wraps a Scanner and holds a successfully
recognized value.
When a value is successfully recognized, the Recognizer stores the value in
its data field and returns itself. If a value is not recognized, the
Recognizer rewinds the scanner to the previous position and returns itself.
§Type Parameters
T- The type of the data to scan.U- The type of the value to recognize.'a- The lifetime of the data to scan.'container- The lifetime of theRecognizer.
Implementations§
Source§impl<'a, 'b, T, R: RecognizeSelf<'a, T, R>> Recognizer<'a, 'b, T, R>
impl<'a, 'b, T, R: RecognizeSelf<'a, T, R>> Recognizer<'a, 'b, T, R>
Sourcepub fn new(scanner: &'b mut Scanner<'a, T>) -> Self
pub fn new(scanner: &'b mut Scanner<'a, T>) -> Self
Create a new Recognizer with the given scanner.
§Arguments
scanner- The scanner to use when recognizing input.
§Returns
A new Recognizer that uses the given scanner.
Examples found in repository?
34 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
35 OptionalWhitespaces::accept(scanner)?;
36 let lhs = Number::accept(scanner)?.0;
37 OptionalWhitespaces::accept(scanner)?;
38 let op = Recognizer::<u8, BinaryOperator>::new(scanner)
39 .try_or(BinaryOperator::Add)?
40 .try_or(BinaryOperator::Mul)?
41 .finish()
42 .ok_or(ParseError::UnexpectedToken)?;
43 OptionalWhitespaces::accept(scanner)?;
44 let rhs = Number::accept(scanner)?.0;
45 OptionalWhitespaces::accept(scanner)?;
46 Ok(Reducted { lhs, op, rhs })
47 }
48}
49
50// ------------------------------------------------------------
51// +++ RightExpression
52// ------------------------------------------------------------
53
54#[derive(Debug)]
55struct RightExpression {
56 lhs: usize,
57 op: BinaryOperator,
58 rhs: Box<Expression>,
59}
60
61impl<'a> Visitor<'a, u8> for RightExpression {
62 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
63 OptionalWhitespaces::accept(scanner)?;
64 let lhs = Number::accept(scanner)?.0;
65 OptionalWhitespaces::accept(scanner)?;
66 let op = Recognizer::<u8, BinaryOperator>::new(scanner)
67 .try_or(BinaryOperator::Add)?
68 .try_or(BinaryOperator::Mul)?
69 .finish()
70 .ok_or(ParseError::UnexpectedToken)?;
71 OptionalWhitespaces::accept(scanner)?;
72 let rhs = Expression::accept(scanner)?;
73 OptionalWhitespaces::accept(scanner)?;
74 Ok(RightExpression {
75 lhs,
76 op,
77 rhs: Box::new(rhs),
78 })
79 }More examples
33fn main() -> ParseResult<()> {
34 let data = b"== 2";
35 let mut scanner = Scanner::new(data);
36 let recognized = Recognizer::new(&mut scanner)
37 .try_or(OperatorTokens::NotEqual)?
38 .try_or(OperatorTokens::Equal)?
39 .finish()
40 .ok_or(ParseError::UnexpectedToken)?;
41
42 println!("{:?}", recognized); // ==
43
44 let data = b"!= 2";
45 let mut scanner = Scanner::new(data);
46 let recognized = Recognizer::new(&mut scanner)
47 .try_or(OperatorTokens::NotEqual)?
48 .try_or(OperatorTokens::Equal)?
49 .finish()
50 .ok_or(ParseError::UnexpectedToken)?;
51
52 println!("{:?}", recognized); // !=
53
54 let data = b"> 2";
55 let mut scanner = Scanner::new(data);
56 let recognized = Recognizer::new(&mut scanner)
57 .try_or(OperatorTokens::NotEqual)?
58 .try_or(OperatorTokens::Equal)?
59 .finish()
60 .ok_or(ParseError::UnexpectedToken);
61
62 println!("{:?}", recognized); // error (UnexpectedToken)
63
64 Ok(())
65}Sourcepub fn try_or(self, element: R) -> ParseResult<Recognizer<'a, 'b, T, R>>
pub fn try_or(self, element: R) -> ParseResult<Recognizer<'a, 'b, T, R>>
Attempt to recognize a U using the given element, and return the
current recognizer if it fails.
§Arguments
element- ARecognizablethat recognizes aU.
§Returns
If the U is successfully recognized, returns the current recognizer with
the resulting value in data. If the U is not successfully recognized,
returns the current recognizer with the current position of the scanner
rewound to the position at which the U was attempted, and data is left
None.
Examples found in repository?
34 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
35 OptionalWhitespaces::accept(scanner)?;
36 let lhs = Number::accept(scanner)?.0;
37 OptionalWhitespaces::accept(scanner)?;
38 let op = Recognizer::<u8, BinaryOperator>::new(scanner)
39 .try_or(BinaryOperator::Add)?
40 .try_or(BinaryOperator::Mul)?
41 .finish()
42 .ok_or(ParseError::UnexpectedToken)?;
43 OptionalWhitespaces::accept(scanner)?;
44 let rhs = Number::accept(scanner)?.0;
45 OptionalWhitespaces::accept(scanner)?;
46 Ok(Reducted { lhs, op, rhs })
47 }
48}
49
50// ------------------------------------------------------------
51// +++ RightExpression
52// ------------------------------------------------------------
53
54#[derive(Debug)]
55struct RightExpression {
56 lhs: usize,
57 op: BinaryOperator,
58 rhs: Box<Expression>,
59}
60
61impl<'a> Visitor<'a, u8> for RightExpression {
62 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
63 OptionalWhitespaces::accept(scanner)?;
64 let lhs = Number::accept(scanner)?.0;
65 OptionalWhitespaces::accept(scanner)?;
66 let op = Recognizer::<u8, BinaryOperator>::new(scanner)
67 .try_or(BinaryOperator::Add)?
68 .try_or(BinaryOperator::Mul)?
69 .finish()
70 .ok_or(ParseError::UnexpectedToken)?;
71 OptionalWhitespaces::accept(scanner)?;
72 let rhs = Expression::accept(scanner)?;
73 OptionalWhitespaces::accept(scanner)?;
74 Ok(RightExpression {
75 lhs,
76 op,
77 rhs: Box::new(rhs),
78 })
79 }More examples
33fn main() -> ParseResult<()> {
34 let data = b"== 2";
35 let mut scanner = Scanner::new(data);
36 let recognized = Recognizer::new(&mut scanner)
37 .try_or(OperatorTokens::NotEqual)?
38 .try_or(OperatorTokens::Equal)?
39 .finish()
40 .ok_or(ParseError::UnexpectedToken)?;
41
42 println!("{:?}", recognized); // ==
43
44 let data = b"!= 2";
45 let mut scanner = Scanner::new(data);
46 let recognized = Recognizer::new(&mut scanner)
47 .try_or(OperatorTokens::NotEqual)?
48 .try_or(OperatorTokens::Equal)?
49 .finish()
50 .ok_or(ParseError::UnexpectedToken)?;
51
52 println!("{:?}", recognized); // !=
53
54 let data = b"> 2";
55 let mut scanner = Scanner::new(data);
56 let recognized = Recognizer::new(&mut scanner)
57 .try_or(OperatorTokens::NotEqual)?
58 .try_or(OperatorTokens::Equal)?
59 .finish()
60 .ok_or(ParseError::UnexpectedToken);
61
62 println!("{:?}", recognized); // error (UnexpectedToken)
63
64 Ok(())
65}Sourcepub fn finish(self) -> Option<R>
pub fn finish(self) -> Option<R>
Consume the recognizer and return the U that was recognized if the
recognizer was successful.
§Returns
If the recognizer was successful (i.e., data is Some), returns the
U that was recognized. Otherwise, returns None.
Examples found in repository?
34 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
35 OptionalWhitespaces::accept(scanner)?;
36 let lhs = Number::accept(scanner)?.0;
37 OptionalWhitespaces::accept(scanner)?;
38 let op = Recognizer::<u8, BinaryOperator>::new(scanner)
39 .try_or(BinaryOperator::Add)?
40 .try_or(BinaryOperator::Mul)?
41 .finish()
42 .ok_or(ParseError::UnexpectedToken)?;
43 OptionalWhitespaces::accept(scanner)?;
44 let rhs = Number::accept(scanner)?.0;
45 OptionalWhitespaces::accept(scanner)?;
46 Ok(Reducted { lhs, op, rhs })
47 }
48}
49
50// ------------------------------------------------------------
51// +++ RightExpression
52// ------------------------------------------------------------
53
54#[derive(Debug)]
55struct RightExpression {
56 lhs: usize,
57 op: BinaryOperator,
58 rhs: Box<Expression>,
59}
60
61impl<'a> Visitor<'a, u8> for RightExpression {
62 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
63 OptionalWhitespaces::accept(scanner)?;
64 let lhs = Number::accept(scanner)?.0;
65 OptionalWhitespaces::accept(scanner)?;
66 let op = Recognizer::<u8, BinaryOperator>::new(scanner)
67 .try_or(BinaryOperator::Add)?
68 .try_or(BinaryOperator::Mul)?
69 .finish()
70 .ok_or(ParseError::UnexpectedToken)?;
71 OptionalWhitespaces::accept(scanner)?;
72 let rhs = Expression::accept(scanner)?;
73 OptionalWhitespaces::accept(scanner)?;
74 Ok(RightExpression {
75 lhs,
76 op,
77 rhs: Box::new(rhs),
78 })
79 }More examples
33fn main() -> ParseResult<()> {
34 let data = b"== 2";
35 let mut scanner = Scanner::new(data);
36 let recognized = Recognizer::new(&mut scanner)
37 .try_or(OperatorTokens::NotEqual)?
38 .try_or(OperatorTokens::Equal)?
39 .finish()
40 .ok_or(ParseError::UnexpectedToken)?;
41
42 println!("{:?}", recognized); // ==
43
44 let data = b"!= 2";
45 let mut scanner = Scanner::new(data);
46 let recognized = Recognizer::new(&mut scanner)
47 .try_or(OperatorTokens::NotEqual)?
48 .try_or(OperatorTokens::Equal)?
49 .finish()
50 .ok_or(ParseError::UnexpectedToken)?;
51
52 println!("{:?}", recognized); // !=
53
54 let data = b"> 2";
55 let mut scanner = Scanner::new(data);
56 let recognized = Recognizer::new(&mut scanner)
57 .try_or(OperatorTokens::NotEqual)?
58 .try_or(OperatorTokens::Equal)?
59 .finish()
60 .ok_or(ParseError::UnexpectedToken);
61
62 println!("{:?}", recognized); // error (UnexpectedToken)
63
64 Ok(())
65}Sourcepub fn finish_with<F>(self, closure: F) -> ParseResult<R>
pub fn finish_with<F>(self, closure: F) -> ParseResult<R>
Consume the recognizer and return the U that was recognized if the
recognizer was successful, or run the given closure if the recognizer was
not successful.
§Arguments
closure- A function that takes theScannerand returns aParseResult<U>.
§Returns
If the recognizer was successful (i.e., data is Some), returns the
U that was recognized. If the recognizer was not successful, the
closure is called with the Scanner and the result of the closure is
returned.