pub fn recognize<'a, T, V, R: Recognizable<'a, T, V>>(
recognizable: R,
scanner: &mut Scanner<'a, T>,
) -> ParseResult<V>Expand description
Recognize an object for the given scanner.
§Type Parameters
V- The type of the object to recognizeR- The type of the recognizable object
§Arguments
recognizable- The recognizable object to use for recognitionscanner- The scanner to recognize the object for
§Returns
Ok(V)if the object was recognized,Err(ParseError)if an error occurred
This function calls the recognize method of the recognizable object and
returns its result. If the recognizable object was not recognized, an
Err(ParseError::UnexpectedToken) is returned. If the scanner is at the end
of its input and the recognizable object is longer than the remaining input,
an Err(ParseError::UnexpectedEndOfInput) is returned.
Examples found in repository?
More examples
examples/turbofish_data_visitor.rs (line 18)
16 fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
17 // recognize the turbofish operator start "::<".
18 recognize(Token::Colon, scanner)?;
19 recognize(Token::Colon, scanner)?;
20 recognize(Token::LessThan, scanner)?;
21 Ok(TurbofishStartTokens)
22 }
23}
24
25// Implement the `Visitor` trait for the turbofish operator.
26impl<'a> Visitor<'a, u8> for Turbofish {
27 fn accept(scanner: &mut noa_parser::scanner::Scanner<u8>) -> ParseResult<Self> {
28 // recognize the turbofish operator start "::<".
29 TurbofishStartTokens::accept(scanner)?;
30 // recognize the number
31 let number = Number::accept(scanner)?.0;
32 // recognize the turbofish operator end ">"
33 recognize(Token::GreaterThan, scanner)?;
34 Ok(Turbofish(number))
35 }examples/colors.rs (line 36)
34 fn accept(scanner: &mut Scanner<u8>) -> ParseResult<Self> {
35 // recognize the rgb color start "("
36 recognize(Token::OpenParen, scanner)?;
37 // recognize the red number
38 let red = Number::accept(scanner)?.0;
39 // recognize the comma
40 recognize(Token::Comma, scanner)?;
41 recognize(Token::Whitespace, scanner)?;
42 // recognize the green number
43 let green = Number::accept(scanner)?.0;
44 // recognize the comma
45 recognize(Token::Comma, scanner)?;
46 recognize(Token::Whitespace, scanner)?;
47 // recognize the blue number
48 let blue = Number::accept(scanner)?.0;
49 // recognize the rgb color end ")"
50 recognize(Token::CloseParen, scanner)?;
51 Ok(TupleColor(red, green, blue))
52 }
53}
54
55impl<'a> Visitor<'a, u8> for RgbColor {
56 fn accept(scanner: &mut Scanner<u8>) -> ParseResult<Self> {
57 let prefix = DataString::<&str>::accept(scanner)?.0;
58
59 if prefix != "rgb" {
60 return Err(UnexpectedToken);
61 }
62
63 // recognize the rgb color start "("
64 recognize(Token::OpenParen, scanner)?;
65 // recognize the red number
66 let red = Number::accept(scanner)?.0;
67 // recognize the comma
68 recognize(Token::Comma, scanner)?;
69 recognize(Token::Whitespace, scanner)?;
70 // recognize the green number
71 let green = Number::accept(scanner)?.0;
72 // recognize the comma
73 recognize(Token::Comma, scanner)?;
74 recognize(Token::Whitespace, scanner)?;
75 // recognize the blue number
76 let blue = Number::accept(scanner)?.0;
77 // recognize the rgb color end ")"
78 recognize(Token::CloseParen, scanner)?;
79 Ok(RgbColor(red, green, blue))
80 }
81}
82
83impl<'a> Visitor<'a, u8> for HexColor {
84 fn accept(scanner: &mut Scanner<u8>) -> ParseResult<Self> {
85 recognize(Token::Sharp, scanner)?;
86 let content = DataString::<&str>::accept(scanner)?.0;
87 let (red, green, blue) = (
88 u8::from_str_radix(&content[0..2], 16)?,
89 u8::from_str_radix(&content[2..4], 16)?,
90 u8::from_str_radix(&content[4..6], 16)?,
91 );
92 Ok(HexColor(red, green, blue))
93 }