• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! Combinators applying parsers in sequence
2 
3 #[cfg(test)]
4 mod tests;
5 
6 use crate::error::ParseError;
7 use crate::internal::{IResult, Parser};
8 
9 /// Gets an object from the first parser,
10 /// then gets another object from the second parser.
11 ///
12 /// # Arguments
13 /// * `first` The first parser to apply.
14 /// * `second` The second parser to apply.
15 ///
16 /// ```rust
17 /// # use nom::{Err, error::ErrorKind, Needed};
18 /// # use nom::Needed::Size;
19 /// use nom::sequence::pair;
20 /// use nom::bytes::complete::tag;
21 ///
22 /// let mut parser = pair(tag("abc"), tag("efg"));
23 ///
24 /// assert_eq!(parser("abcefg"), Ok(("", ("abc", "efg"))));
25 /// assert_eq!(parser("abcefghij"), Ok(("hij", ("abc", "efg"))));
26 /// assert_eq!(parser(""), Err(Err::Error(("", ErrorKind::Tag))));
27 /// assert_eq!(parser("123"), Err(Err::Error(("123", ErrorKind::Tag))));
28 /// ```
pair<I, O1, O2, E: ParseError<I>, F, G>( mut first: F, mut second: G, ) -> impl FnMut(I) -> IResult<I, (O1, O2), E> where F: Parser<I, O1, E>, G: Parser<I, O2, E>,29 pub fn pair<I, O1, O2, E: ParseError<I>, F, G>(
30   mut first: F,
31   mut second: G,
32 ) -> impl FnMut(I) -> IResult<I, (O1, O2), E>
33 where
34   F: Parser<I, O1, E>,
35   G: Parser<I, O2, E>,
36 {
37   move |input: I| {
38     let (input, o1) = first.parse(input)?;
39     second.parse(input).map(|(i, o2)| (i, (o1, o2)))
40   }
41 }
42 
43 /// Matches an object from the first parser and discards it,
44 /// then gets an object from the second parser.
45 ///
46 /// # Arguments
47 /// * `first` The opening parser.
48 /// * `second` The second parser to get object.
49 ///
50 /// ```rust
51 /// # use nom::{Err, error::ErrorKind, Needed};
52 /// # use nom::Needed::Size;
53 /// use nom::sequence::preceded;
54 /// use nom::bytes::complete::tag;
55 ///
56 /// let mut parser = preceded(tag("abc"), tag("efg"));
57 ///
58 /// assert_eq!(parser("abcefg"), Ok(("", "efg")));
59 /// assert_eq!(parser("abcefghij"), Ok(("hij", "efg")));
60 /// assert_eq!(parser(""), Err(Err::Error(("", ErrorKind::Tag))));
61 /// assert_eq!(parser("123"), Err(Err::Error(("123", ErrorKind::Tag))));
62 /// ```
preceded<I, O1, O2, E: ParseError<I>, F, G>( mut first: F, mut second: G, ) -> impl FnMut(I) -> IResult<I, O2, E> where F: Parser<I, O1, E>, G: Parser<I, O2, E>,63 pub fn preceded<I, O1, O2, E: ParseError<I>, F, G>(
64   mut first: F,
65   mut second: G,
66 ) -> impl FnMut(I) -> IResult<I, O2, E>
67 where
68   F: Parser<I, O1, E>,
69   G: Parser<I, O2, E>,
70 {
71   move |input: I| {
72     let (input, _) = first.parse(input)?;
73     second.parse(input)
74   }
75 }
76 
77 /// Gets an object from the first parser,
78 /// then matches an object from the second parser and discards it.
79 ///
80 /// # Arguments
81 /// * `first` The first parser to apply.
82 /// * `second` The second parser to match an object.
83 ///
84 /// ```rust
85 /// # use nom::{Err, error::ErrorKind, Needed};
86 /// # use nom::Needed::Size;
87 /// use nom::sequence::terminated;
88 /// use nom::bytes::complete::tag;
89 ///
90 /// let mut parser = terminated(tag("abc"), tag("efg"));
91 ///
92 /// assert_eq!(parser("abcefg"), Ok(("", "abc")));
93 /// assert_eq!(parser("abcefghij"), Ok(("hij", "abc")));
94 /// assert_eq!(parser(""), Err(Err::Error(("", ErrorKind::Tag))));
95 /// assert_eq!(parser("123"), Err(Err::Error(("123", ErrorKind::Tag))));
96 /// ```
terminated<I, O1, O2, E: ParseError<I>, F, G>( mut first: F, mut second: G, ) -> impl FnMut(I) -> IResult<I, O1, E> where F: Parser<I, O1, E>, G: Parser<I, O2, E>,97 pub fn terminated<I, O1, O2, E: ParseError<I>, F, G>(
98   mut first: F,
99   mut second: G,
100 ) -> impl FnMut(I) -> IResult<I, O1, E>
101 where
102   F: Parser<I, O1, E>,
103   G: Parser<I, O2, E>,
104 {
105   move |input: I| {
106     let (input, o1) = first.parse(input)?;
107     second.parse(input).map(|(i, _)| (i, o1))
108   }
109 }
110 
111 /// Gets an object from the first parser,
112 /// then matches an object from the sep_parser and discards it,
113 /// then gets another object from the second parser.
114 ///
115 /// # Arguments
116 /// * `first` The first parser to apply.
117 /// * `sep` The separator parser to apply.
118 /// * `second` The second parser to apply.
119 ///
120 /// ```rust
121 /// # use nom::{Err, error::ErrorKind, Needed};
122 /// # use nom::Needed::Size;
123 /// use nom::sequence::separated_pair;
124 /// use nom::bytes::complete::tag;
125 ///
126 /// let mut parser = separated_pair(tag("abc"), tag("|"), tag("efg"));
127 ///
128 /// assert_eq!(parser("abc|efg"), Ok(("", ("abc", "efg"))));
129 /// assert_eq!(parser("abc|efghij"), Ok(("hij", ("abc", "efg"))));
130 /// assert_eq!(parser(""), Err(Err::Error(("", ErrorKind::Tag))));
131 /// assert_eq!(parser("123"), Err(Err::Error(("123", ErrorKind::Tag))));
132 /// ```
separated_pair<I, O1, O2, O3, E: ParseError<I>, F, G, H>( mut first: F, mut sep: G, mut second: H, ) -> impl FnMut(I) -> IResult<I, (O1, O3), E> where F: Parser<I, O1, E>, G: Parser<I, O2, E>, H: Parser<I, O3, E>,133 pub fn separated_pair<I, O1, O2, O3, E: ParseError<I>, F, G, H>(
134   mut first: F,
135   mut sep: G,
136   mut second: H,
137 ) -> impl FnMut(I) -> IResult<I, (O1, O3), E>
138 where
139   F: Parser<I, O1, E>,
140   G: Parser<I, O2, E>,
141   H: Parser<I, O3, E>,
142 {
143   move |input: I| {
144     let (input, o1) = first.parse(input)?;
145     let (input, _) = sep.parse(input)?;
146     second.parse(input).map(|(i, o2)| (i, (o1, o2)))
147   }
148 }
149 
150 /// Matches an object from the first parser and discards it,
151 /// then gets an object from the second parser,
152 /// and finally matches an object from the third parser and discards it.
153 ///
154 /// # Arguments
155 /// * `first` The first parser to apply and discard.
156 /// * `second` The second parser to apply.
157 /// * `third` The third parser to apply and discard.
158 ///
159 /// ```rust
160 /// # use nom::{Err, error::ErrorKind, Needed};
161 /// # use nom::Needed::Size;
162 /// use nom::sequence::delimited;
163 /// use nom::bytes::complete::tag;
164 ///
165 /// let mut parser = delimited(tag("("), tag("abc"), tag(")"));
166 ///
167 /// assert_eq!(parser("(abc)"), Ok(("", "abc")));
168 /// assert_eq!(parser("(abc)def"), Ok(("def", "abc")));
169 /// assert_eq!(parser(""), Err(Err::Error(("", ErrorKind::Tag))));
170 /// assert_eq!(parser("123"), Err(Err::Error(("123", ErrorKind::Tag))));
171 /// ```
delimited<I, O1, O2, O3, E: ParseError<I>, F, G, H>( mut first: F, mut second: G, mut third: H, ) -> impl FnMut(I) -> IResult<I, O2, E> where F: Parser<I, O1, E>, G: Parser<I, O2, E>, H: Parser<I, O3, E>,172 pub fn delimited<I, O1, O2, O3, E: ParseError<I>, F, G, H>(
173   mut first: F,
174   mut second: G,
175   mut third: H,
176 ) -> impl FnMut(I) -> IResult<I, O2, E>
177 where
178   F: Parser<I, O1, E>,
179   G: Parser<I, O2, E>,
180   H: Parser<I, O3, E>,
181 {
182   move |input: I| {
183     let (input, _) = first.parse(input)?;
184     let (input, o2) = second.parse(input)?;
185     third.parse(input).map(|(i, _)| (i, o2))
186   }
187 }
188 
189 /// Helper trait for the tuple combinator.
190 ///
191 /// This trait is implemented for tuples of parsers of up to 21 elements.
192 pub trait Tuple<I, O, E> {
193   /// Parses the input and returns a tuple of results of each parser.
parse(&mut self, input: I) -> IResult<I, O, E>194   fn parse(&mut self, input: I) -> IResult<I, O, E>;
195 }
196 
197 impl<Input, Output, Error: ParseError<Input>, F: Parser<Input, Output, Error>>
198   Tuple<Input, (Output,), Error> for (F,)
199 {
parse(&mut self, input: Input) -> IResult<Input, (Output,), Error>200   fn parse(&mut self, input: Input) -> IResult<Input, (Output,), Error> {
201     self.0.parse(input).map(|(i, o)| (i, (o,)))
202   }
203 }
204 
205 macro_rules! tuple_trait(
206   ($name1:ident $ty1:ident, $name2: ident $ty2:ident, $($name:ident $ty:ident),*) => (
207     tuple_trait!(__impl $name1 $ty1, $name2 $ty2; $($name $ty),*);
208   );
209   (__impl $($name:ident $ty: ident),+; $name1:ident $ty1:ident, $($name2:ident $ty2:ident),*) => (
210     tuple_trait_impl!($($name $ty),+);
211     tuple_trait!(__impl $($name $ty),+ , $name1 $ty1; $($name2 $ty2),*);
212   );
213   (__impl $($name:ident $ty: ident),+; $name1:ident $ty1:ident) => (
214     tuple_trait_impl!($($name $ty),+);
215     tuple_trait_impl!($($name $ty),+, $name1 $ty1);
216   );
217 );
218 
219 macro_rules! tuple_trait_impl(
220   ($($name:ident $ty: ident),+) => (
221     impl<
222       Input: Clone, $($ty),+ , Error: ParseError<Input>,
223       $($name: Parser<Input, $ty, Error>),+
224     > Tuple<Input, ( $($ty),+ ), Error> for ( $($name),+ ) {
225 
226       fn parse(&mut self, input: Input) -> IResult<Input, ( $($ty),+ ), Error> {
227         tuple_trait_inner!(0, self, input, (), $($name)+)
228 
229       }
230     }
231   );
232 );
233 
234 macro_rules! tuple_trait_inner(
235   ($it:tt, $self:expr, $input:expr, (), $head:ident $($id:ident)+) => ({
236     let (i, o) = $self.$it.parse($input.clone())?;
237 
238     succ!($it, tuple_trait_inner!($self, i, ( o ), $($id)+))
239   });
240   ($it:tt, $self:expr, $input:expr, ($($parsed:tt)*), $head:ident $($id:ident)+) => ({
241     let (i, o) = $self.$it.parse($input.clone())?;
242 
243     succ!($it, tuple_trait_inner!($self, i, ($($parsed)* , o), $($id)+))
244   });
245   ($it:tt, $self:expr, $input:expr, ($($parsed:tt)*), $head:ident) => ({
246     let (i, o) = $self.$it.parse($input.clone())?;
247 
248     Ok((i, ($($parsed)* , o)))
249   });
250 );
251 
252 tuple_trait!(FnA A, FnB B, FnC C, FnD D, FnE E, FnF F, FnG G, FnH H, FnI I, FnJ J, FnK K, FnL L,
253   FnM M, FnN N, FnO O, FnP P, FnQ Q, FnR R, FnS S, FnT T, FnU U);
254 
255 // Special case: implement `Tuple` for `()`, the unit type.
256 // This can come up in macros which accept a variable number of arguments.
257 // Literally, `()` is an empty tuple, so it should simply parse nothing.
258 impl<I, E: ParseError<I>> Tuple<I, (), E> for () {
parse(&mut self, input: I) -> IResult<I, (), E>259   fn parse(&mut self, input: I) -> IResult<I, (), E> {
260     Ok((input, ()))
261   }
262 }
263 
264 ///Applies a tuple of parsers one by one and returns their results as a tuple.
265 ///There is a maximum of 21 parsers
266 /// ```rust
267 /// # use nom::{Err, error::ErrorKind};
268 /// use nom::sequence::tuple;
269 /// use nom::character::complete::{alpha1, digit1};
270 /// let mut parser = tuple((alpha1, digit1, alpha1));
271 ///
272 /// assert_eq!(parser("abc123def"), Ok(("", ("abc", "123", "def"))));
273 /// assert_eq!(parser("123def"), Err(Err::Error(("123def", ErrorKind::Alpha))));
274 /// ```
tuple<I, O, E: ParseError<I>, List: Tuple<I, O, E>>( mut l: List, ) -> impl FnMut(I) -> IResult<I, O, E>275 pub fn tuple<I, O, E: ParseError<I>, List: Tuple<I, O, E>>(
276   mut l: List,
277 ) -> impl FnMut(I) -> IResult<I, O, E> {
278   move |i: I| l.parse(i)
279 }
280