1 //! A collection of both concrete parsers as well as parser combinators.
2 //!
3 //! Implements the [`Parser`] trait which is the core of `combine` and contains the submodules
4 //! implementing all combine parsers.
5 
6 use crate::{
7     error::{
8         ErrorInfo, ParseError,
9         ParseResult::{self, *},
10         ResultExt, StreamError, Token, Tracked,
11     },
12     parser::{
13         combinator::{
14             and_then, flat_map, map, map_input, spanned, AndThen, Either, FlatMap, Map, MapInput,
15             Spanned,
16         },
17         error::{expected, message, silent, Expected, Message, Silent},
18         repeat::Iter,
19         sequence::{then, then_partial, then_ref, Then, ThenPartial, ThenRef},
20     },
21     stream::{Stream, StreamErrorFor, StreamOnce},
22     ErrorOffset,
23 };
24 
25 use self::{
26     choice::{or, Or},
27     sequence::{skip, with, Skip, With},
28 };
29 
30 #[cfg(feature = "alloc")]
31 use alloc::boxed::Box;
32 
33 /// Internal API. May break without a semver bump
34 #[macro_export]
35 #[doc(hidden)]
36 macro_rules! parse_mode {
37     ($input_type: ty) => {
38         #[inline]
39         fn parse_partial(
40             &mut self,
41             input: &mut $input_type,
42             state: &mut Self::PartialState,
43         ) -> $crate::error::ParseResult<Self::Output, <$input_type as $crate::StreamOnce>::Error> {
44             self.parse_mode($crate::parser::PartialMode::default(), input, state)
45         }
46 
47         #[inline]
48         fn parse_first(
49             &mut self,
50             input: &mut $input_type,
51             state: &mut Self::PartialState,
52         ) -> $crate::error::ParseResult<Self::Output, <$input_type as $crate::StreamOnce>::Error> {
53             self.parse_mode($crate::parser::FirstMode, input, state)
54         }
55     };
56 }
57 
58 pub mod byte;
59 pub mod char;
60 pub mod choice;
61 pub mod combinator;
62 pub mod error;
63 pub mod function;
64 pub mod range;
65 #[cfg(feature = "regex")]
66 #[cfg_attr(docsrs, doc(cfg(feature = "regex")))]
67 pub mod regex;
68 pub mod repeat;
69 pub mod sequence;
70 pub mod token;
71 
72 /// By implementing the `Parser` trait a type says that it can be used to parse an input stream
73 /// into the type `Output`.
74 ///
75 /// All methods have a default implementation but there needs to be at least an implementation of
76 /// [`parse_stream`], [`parse_stream`], or [`parse_lazy`]. If the last is implemented, an
77 /// implementation of [`add_error`] may also be required. See the documentation for
78 /// [`parse_lazy`] for details.
79 ///
80 /// [`parse_stream`]: trait.Parser.html#method.parse_stream
81 /// [`parse_stream`]: trait.Parser.html#method.parse_stream
82 /// [`parse_lazy`]: trait.Parser.html#method.parse_lazy
83 /// [`add_error`]: trait.Parser.html#method.add_error
84 pub trait Parser<Input: Stream> {
85     /// The type which is returned if the parser is successful.
86     type Output;
87 
88     /// Determines the state necessary to resume parsing after more input is supplied.
89     ///
90     /// If partial parsing is not supported this can be set to `()`.
91     type PartialState: Default;
92 
93     /// Entry point of the parser. Takes some input and tries to parse it.
94     ///
95     /// Returns the parsed result and the remaining input if the parser succeeds, or a
96     /// error otherwise.
97     ///
98     /// This is the most straightforward entry point to a parser. Since it does not decorate the
99     /// input in any way you may find the error messages a hard to read. If that is the case you
100     /// may want to try wrapping your input with an [`easy::Stream`] or call [`easy_parse`]
101     /// instead.
102     ///
103     /// [`easy::Stream`]: super::easy::Stream
104     /// [`easy_parse`]: super::parser::EasyParser::easy_parse
parse( &mut self, mut input: Input, ) -> Result<(Self::Output, Input), <Input as StreamOnce>::Error>105     fn parse(
106         &mut self,
107         mut input: Input,
108     ) -> Result<(Self::Output, Input), <Input as StreamOnce>::Error> {
109         match self.parse_stream(&mut input).into() {
110             Ok((v, _)) => Ok((v, input)),
111             Err(error) => Err(error.into_inner().error),
112         }
113     }
114 
115     /// Entry point of the parser when using partial parsing.
116     /// Takes some input and tries to parse it.
117     ///
118     /// Returns the parsed result and the remaining input if the parser succeeds, or a
119     /// error otherwise.
parse_with_state( &mut self, input: &mut Input, state: &mut Self::PartialState, ) -> Result<Self::Output, <Input as StreamOnce>::Error>120     fn parse_with_state(
121         &mut self,
122         input: &mut Input,
123         state: &mut Self::PartialState,
124     ) -> Result<Self::Output, <Input as StreamOnce>::Error> {
125         match self.parse_stream_partial(input, state).into() {
126             Ok((v, _)) => Ok(v),
127             Err(error) => Err(error.into_inner().error),
128         }
129     }
130 
131     /// Parses using the stream `input` by calling [`Stream::uncons`] one or more times.
132     ///
133     /// Semantically equivalent to [`parse_stream`], except this method returns a flattened result
134     /// type, combining `Result` and [`Commit`] into a single [`ParseResult`].
135     ///
136     /// [`Stream::uncons`]: super::stream::StreamOnce::uncons
137     /// [`parse_stream`]: Parser::parse_stream
138     /// [`Commit`]: super::error::Commit
139     /// [`ParseResult`]: super::error::ParseResult
140     #[inline]
parse_stream( &mut self, input: &mut Input, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>141     fn parse_stream(
142         &mut self,
143         input: &mut Input,
144     ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
145         let before = input.checkpoint();
146         let mut state = Default::default();
147         let mut result = self.parse_first(input, &mut state);
148         if let ParseResult::PeekErr(ref mut error) = result {
149             ctry!(input.reset(before.clone()).committed());
150             if let Ok(t) = input.uncons() {
151                 ctry!(input.reset(before).committed());
152                 error.error.add_unexpected(Token(t));
153             } else {
154                 error.error.add(StreamErrorFor::<Input>::end_of_input());
155             }
156             self.add_error(error);
157         }
158         result
159     }
160 
161     /// Parses using the stream `input` by calling [`Stream::uncons`] one or more times.
162     ///
163     /// Specialized version of [`parse_stream`] which permits error value creation to be
164     /// skipped in the common case.
165     ///
166     /// When this parser returns `PeekErr`, this method is allowed to return an empty
167     /// [`Error`]. The error value that would have been returned can instead be obtained by
168     /// calling [`add_error`]. This allows a parent parser such as `choice` to skip the creation of
169     /// an unnecessary error value, if an alternative parser succeeds.
170     ///
171     /// Parsers should seek to implement this function instead of the above two if errors can be
172     /// encountered before consuming input. The default implementation always returns all errors,
173     /// with [`add_error`] being a no-op.
174     ///
175     /// [`Stream::uncons`]: super::stream::StreamOnce::uncons
176     /// [`parse_stream`]: Parser::parse_stream
177     /// [`Error`]: super::stream::StreamOnce::Error
178     /// [`add_error`]: trait.Parser.html#method.add_error
179     #[inline]
parse_lazy( &mut self, input: &mut Input, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>180     fn parse_lazy(
181         &mut self,
182         input: &mut Input,
183     ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
184         if input.is_partial() {
185             // If a partial parser were called from a non-partial parser (as it is here) we must
186             // reset the input to before the partial parser were called on errors that committed
187             // data as that parser's partial state was just temporary and it will not be able to
188             // resume itself
189             let before = input.checkpoint();
190             let result = self.parse_first(input, &mut Default::default());
191             if let CommitErr(_) = result {
192                 ctry!(input.reset(before).committed());
193             }
194             result
195         } else {
196             self.parse_first(input, &mut Default::default())
197         }
198     }
199 
200     /// Adds the first error that would normally be returned by this parser if it failed with an
201     /// `PeekErr` result.
202     ///
203     /// See [`parse_lazy`] for details.
204     ///
205     /// [`parse_lazy`]: trait.Parser.html#method.parse_lazy
add_error(&mut self, _error: &mut Tracked<<Input as StreamOnce>::Error>)206     fn add_error(&mut self, _error: &mut Tracked<<Input as StreamOnce>::Error>) {}
207 
208     /// Like `parse_stream` but supports partial parsing.
209     #[inline]
parse_stream_partial( &mut self, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>210     fn parse_stream_partial(
211         &mut self,
212         input: &mut Input,
213         state: &mut Self::PartialState,
214     ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
215         let before = input.checkpoint();
216         let mut result = self.parse_partial(input, state);
217         if let ParseResult::PeekErr(ref mut error) = result {
218             ctry!(input.reset(before.clone()).committed());
219             if let Ok(t) = input.uncons() {
220                 ctry!(input.reset(before).committed());
221                 error.error.add_unexpected(Token(t));
222             } else {
223                 error.error.add(StreamErrorFor::<Input>::end_of_input());
224             }
225             self.add_error(error);
226         }
227         result
228     }
229 
230     /// Parses using the stream `input` and allows itself to be resumed at a later point using
231     /// `parse_partial` by storing the necessary intermediate state in `state`.
232     ///
233     /// Unlike `parse_partial` function this is allowed to assume that there is no partial state to
234     /// resume.
235     ///
236     /// Internal API. May break without a semver bump
237     /// Always overridden by the `parse_mode!` macro
238     #[inline]
239     #[doc(hidden)]
parse_first( &mut self, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>240     fn parse_first(
241         &mut self,
242         input: &mut Input,
243         state: &mut Self::PartialState,
244     ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
245         self.parse_partial(input, state)
246     }
247 
248     /// Parses using the stream `input` and allows itself to be resumed at a later point using
249     /// `parse_partial` by storing the necessary intermediate state in `state`
250     ///
251     /// Internal API. May break without a semver bump
252     /// Always overridden by the `parse_mode!` macro
253     #[inline]
254     #[doc(hidden)]
parse_partial( &mut self, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>255     fn parse_partial(
256         &mut self,
257         input: &mut Input,
258         state: &mut Self::PartialState,
259     ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
260         let _ = state;
261         self.parse_lazy(input)
262     }
263 
264     /// Internal API. May break without a semver bump
265     #[doc(hidden)]
266     #[inline]
parse_mode<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode, Self: Sized,267     fn parse_mode<M>(
268         &mut self,
269         mode: M,
270         input: &mut Input,
271         state: &mut Self::PartialState,
272     ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
273     where
274         M: ParseMode,
275         Self: Sized,
276     {
277         mode.parse(self, input, state)
278     }
279 
280     /// Internal API. May break without a semver bump
281     #[doc(hidden)]
282     #[inline]
parse_mode_impl<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode, Self: Sized,283     fn parse_mode_impl<M>(
284         &mut self,
285         mode: M,
286         input: &mut Input,
287         state: &mut Self::PartialState,
288     ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
289     where
290         M: ParseMode,
291         Self: Sized,
292     {
293         if mode.is_first() {
294             self.parse_first(input, state)
295         } else {
296             self.parse_partial(input, state)
297         }
298     }
299 
300     /// Internal API. May break without a semver bump
301     #[doc(hidden)]
302     #[inline]
parse_committed_mode<M>( &mut self, mode: M, input: &mut Input, state: &mut Self::PartialState, ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> where M: ParseMode, Self: Sized,303     fn parse_committed_mode<M>(
304         &mut self,
305         mode: M,
306         input: &mut Input,
307         state: &mut Self::PartialState,
308     ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error>
309     where
310         M: ParseMode,
311         Self: Sized,
312     {
313         if mode.is_first() {
314             FirstMode.parse_committed(self, input, state)
315         } else {
316             PartialMode::default().parse_committed(self, input, state)
317         }
318     }
319 
320     /// Returns how many parsers this parser contains
321     ///
322     /// Internal API: This should not be implemented explicitly outside of combine.
323     #[doc(hidden)]
parser_count(&self) -> ErrorOffset324     fn parser_count(&self) -> ErrorOffset {
325         ErrorOffset(1)
326     }
327 
328     /// Internal API: This should not be implemented explicitly outside of combine.
329     #[doc(hidden)]
add_committed_expected_error(&mut self, _error: &mut Tracked<<Input as StreamOnce>::Error>)330     fn add_committed_expected_error(&mut self, _error: &mut Tracked<<Input as StreamOnce>::Error>) {
331     }
332 
333     /// Borrows a parser instead of consuming it.
334     ///
335     /// Used to apply parser combinators on `self` without losing ownership.
336     ///
337     /// ```
338     /// # extern crate combine;
339     /// # use combine::*;
340     /// # use combine::error::Commit;
341     /// # use combine::parser::char::{digit, letter};
342     /// fn test(input: &mut &'static str) -> StdParseResult<(char, char), &'static str> {
343     ///     let mut p = digit();
344     ///     let ((d, _), committed) = (p.by_ref(), letter()).parse_stream(input).into_result()?;
345     ///     let (d2, committed) = committed.combine(|_| p.parse_stream(input).into_result())?;
346     ///     Ok(((d, d2), committed))
347     /// }
348     ///
349     /// fn main() {
350     ///     let mut input = "1a23";
351     ///     assert_eq!(
352     ///         test(&mut input).map(|(t, c)| (t, c.map(|_| input))),
353     ///         Ok((('1', '2'), Commit::Commit("3")))
354     ///     );
355     /// }
356     /// ```
by_ref(&mut self) -> &mut Self where Self: Sized,357     fn by_ref(&mut self) -> &mut Self
358     where
359         Self: Sized,
360     {
361         self
362     }
363 
364     /// Discards the value of the `self` parser and returns the value of `p`.
365     /// Fails if any of the parsers fails.
366     ///
367     /// ```
368     /// # extern crate combine;
369     /// # use combine::*;
370     /// # use combine::parser::char::digit;
371     /// # fn main() {
372     /// let result = digit()
373     ///     .with(token('i'))
374     ///     .parse("9i")
375     ///     .map(|x| x.0);
376     /// assert_eq!(result, Ok('i'));
377     /// # }
378     /// ```
with<P2>(self, p: P2) -> With<Self, P2> where Self: Sized, P2: Parser<Input>,379     fn with<P2>(self, p: P2) -> With<Self, P2>
380     where
381         Self: Sized,
382         P2: Parser<Input>,
383     {
384         with(self, p)
385     }
386 
387     /// Discards the value of the `p` parser and returns the value of `self`.
388     /// Fails if any of the parsers fails.
389     ///
390     /// ```
391     /// # extern crate combine;
392     /// # use combine::*;
393     /// # use combine::parser::char::digit;
394     /// # fn main() {
395     /// let result = digit()
396     ///     .skip(token('i'))
397     ///     .parse("9i")
398     ///     .map(|x| x.0);
399     /// assert_eq!(result, Ok('9'));
400     /// # }
401     /// ```
skip<P2>(self, p: P2) -> Skip<Self, P2> where Self: Sized, P2: Parser<Input>,402     fn skip<P2>(self, p: P2) -> Skip<Self, P2>
403     where
404         Self: Sized,
405         P2: Parser<Input>,
406     {
407         skip(self, p)
408     }
409 
410     /// Parses with `self` followed by `p`.
411     /// Succeeds if both parsers succeed, otherwise fails.
412     /// Returns a tuple with both values on success.
413     ///
414     /// ```
415     /// # extern crate combine;
416     /// # use combine::*;
417     /// # use combine::parser::char::digit;
418     /// # fn main() {
419     /// let result = digit()
420     ///     .and(token('i'))
421     ///     .parse("9i")
422     ///     .map(|x| x.0);
423     /// assert_eq!(result, Ok(('9', 'i')));
424     /// # }
425     /// ```
and<P2>(self, p: P2) -> (Self, P2) where Self: Sized, P2: Parser<Input>,426     fn and<P2>(self, p: P2) -> (Self, P2)
427     where
428         Self: Sized,
429         P2: Parser<Input>,
430     {
431         (self, p)
432     }
433 
434     /// Returns a parser which attempts to parse using `self`. If `self` fails without committing
435     /// it tries to consume the same input using `p`.
436     ///
437     /// If you are looking to chain 3 or more parsers using `or` you may consider using the
438     /// [`choice!`] macro instead, which can be clearer and may result in a faster parser.
439     ///
440     /// ```
441     /// # extern crate combine;
442     /// # use combine::*;
443     /// # use combine::parser::char::{digit, string};
444     /// # fn main() {
445     /// let mut parser = string("let")
446     ///     .or(digit().map(|_| "digit"))
447     ///     .or(string("led"));
448     /// assert_eq!(parser.parse("let"), Ok(("let", "")));
449     /// assert_eq!(parser.parse("1"), Ok(("digit", "")));
450     /// assert!(parser.parse("led").is_err());
451     ///
452     /// let mut parser2 = string("two").or(string("three"));
453     /// // Fails as the parser for "two" consumes the first 't' before failing
454     /// assert!(parser2.parse("three").is_err());
455     ///
456     /// // Use 'attempt' to make failing parsers always act as if they have not committed any input
457     /// let mut parser3 = attempt(string("two")).or(attempt(string("three")));
458     /// assert_eq!(parser3.parse("three"), Ok(("three", "")));
459     /// # }
460     /// ```
461     ///
462     /// [`choice!`]: super::choice!
or<P2>(self, p: P2) -> Or<Self, P2> where Self: Sized, P2: Parser<Input, Output = Self::Output>,463     fn or<P2>(self, p: P2) -> Or<Self, P2>
464     where
465         Self: Sized,
466         P2: Parser<Input, Output = Self::Output>,
467     {
468         or(self, p)
469     }
470 
471     /// Parses using `self` and then passes the value to `f` which returns a parser used to parse
472     /// the rest of the input.
473     ///
474     /// Since the parser returned from `f` must have a single type it can be useful to use the
475     /// [`left`](Parser::left) and [`right`](Parser::right) methods to merge parsers of differing types into one.
476     ///
477     /// If you are using partial parsing you may want to use [`then_partial`](Parser::then_partial) instead.
478     ///
479     /// ```
480     /// # #![cfg(feature = "std")]
481     /// # extern crate combine;
482     /// # use combine::*;
483     /// # use combine::parser::char::digit;
484     /// # use combine::error::Commit;
485     /// # use combine::stream::easy;
486     /// # fn main() {
487     /// let result = digit()
488     ///     .then(|d| {
489     ///         if d == '9' {
490     ///             value(9).left()
491     ///         }
492     ///         else {
493     ///             unexpected_any(d).message("Not a nine").right()
494     ///         }
495     ///     })
496     ///     .easy_parse("9");
497     /// assert_eq!(result, Ok((9, "")));
498     /// # }
499     /// ```
then<N, F>(self, f: F) -> Then<Self, F> where Self: Sized, F: FnMut(Self::Output) -> N, N: Parser<Input>,500     fn then<N, F>(self, f: F) -> Then<Self, F>
501     where
502         Self: Sized,
503         F: FnMut(Self::Output) -> N,
504         N: Parser<Input>,
505     {
506         then(self, f)
507     }
508 
509     /// Variant of [`then`](Parser::then) which parses using `self` and then passes the value to `f` as a `&mut` reference.
510     ///
511     /// Useful when doing partial parsing since it does not need to store the parser returned by
512     /// `f` in the partial state. Instead it will call `f` each to request a new parser each time
513     /// parsing resumes and that parser is needed.
514     ///
515     /// Since the parser returned from `f` must have a single type it can be useful to use the
516     /// [`left`](Parser::left) and [`right`](Parser::right) methods to merge parsers of differing types into one.
517     ///
518     /// ```
519     /// # #![cfg(feature = "std")]
520     /// # extern crate combine;
521     /// # use combine::*;
522     /// # use combine::parser::char::digit;
523     /// # use combine::error::Commit;
524     /// # use combine::stream::easy;
525     /// # fn main() {
526     /// let result = digit()
527     ///     .then_partial(|d| {
528     ///         if *d == '9' {
529     ///             value(9).left()
530     ///         }
531     ///         else {
532     ///             unexpected_any(*d).message("Not a nine").right()
533     ///         }
534     ///     })
535     ///     .easy_parse("9");
536     /// assert_eq!(result, Ok((9, "")));
537     /// # }
538     /// ```
then_partial<N, F>(self, f: F) -> ThenPartial<Self, F> where Self: Sized, F: FnMut(&mut Self::Output) -> N, N: Parser<Input>,539     fn then_partial<N, F>(self, f: F) -> ThenPartial<Self, F>
540     where
541         Self: Sized,
542         F: FnMut(&mut Self::Output) -> N,
543         N: Parser<Input>,
544     {
545         then_partial(self, f)
546     }
547 
548     /// Parses using `self` and then passes a reference to the value to `f` which returns a parser
549     /// used to parse the rest of the input. The value is then combined with the output of `f`.
550     ///
551     /// Since the parser returned from `f` must have a single type it can be useful to use the
552     /// `left` and `right` methods to merge parsers of differing types into one.
553     ///
554     /// ```
555     /// # #![cfg(feature = "std")]
556     /// # extern crate combine;
557     /// # use combine::*;
558     /// # use combine::parser::char::digit;
559     /// # use combine::error::Commit;
560     /// # use combine::stream::easy;
561     /// # fn main() {
562     /// let result = digit()
563     ///     .then_ref(|d| {
564     ///         if *d == '9' {
565     ///             digit().left()
566     ///         }
567     ///         else {
568     ///             unexpected_any(*d).message("Not a nine").right()
569     ///         }
570     ///     })
571     ///     .easy_parse("98");
572     /// assert_eq!(result, Ok((('9', '8'), "")));
573     /// # }
574     /// ```
then_ref<N, F>(self, f: F) -> ThenRef<Self, F> where Self: Sized, F: FnMut(&Self::Output) -> N, N: Parser<Input>,575     fn then_ref<N, F>(self, f: F) -> ThenRef<Self, F>
576     where
577         Self: Sized,
578         F: FnMut(&Self::Output) -> N,
579         N: Parser<Input>,
580     {
581         then_ref(self, f)
582     }
583 
584     /// Uses `f` to map over the parsed value.
585     ///
586     /// ```
587     /// # extern crate combine;
588     /// # use combine::*;
589     /// # use combine::parser::char::digit;
590     /// # fn main() {
591     /// let result = digit()
592     ///     .map(|c| c == '9')
593     ///     .parse("9")
594     ///     .map(|x| x.0);
595     /// assert_eq!(result, Ok(true));
596     /// # }
597     /// ```
map<F, B>(self, f: F) -> Map<Self, F> where Self: Sized, F: FnMut(Self::Output) -> B,598     fn map<F, B>(self, f: F) -> Map<Self, F>
599     where
600         Self: Sized,
601         F: FnMut(Self::Output) -> B,
602     {
603         map(self, f)
604     }
605 
map_input<F, B>(self, f: F) -> MapInput<Self, F> where Self: Sized, F: FnMut(Self::Output, &mut Input) -> B,606     fn map_input<F, B>(self, f: F) -> MapInput<Self, F>
607     where
608         Self: Sized,
609         F: FnMut(Self::Output, &mut Input) -> B,
610     {
611         map_input(self, f)
612     }
613 
614     /// Uses `f` to map over the output of `self`. If `f` returns an error the parser fails.
615     ///
616     /// ```
617     /// # extern crate combine;
618     /// # use combine::*;
619     /// # use combine::parser::char::digit;
620     /// # use combine::parser::range::take;
621     /// # fn main() {
622     /// let result = take(4)
623     ///     .flat_map(|bs| many(digit()).parse(bs).map(|t| t.0))
624     ///     .parse("12abcd");
625     /// assert_eq!(result, Ok((String::from("12"), "cd")));
626     /// # }
627     /// ```
flat_map<F, B>(self, f: F) -> FlatMap<Self, F> where Self: Sized, F: FnMut(Self::Output) -> Result<B, <Input as StreamOnce>::Error>,628     fn flat_map<F, B>(self, f: F) -> FlatMap<Self, F>
629     where
630         Self: Sized,
631         F: FnMut(Self::Output) -> Result<B, <Input as StreamOnce>::Error>,
632     {
633         flat_map(self, f)
634     }
635 
636     /// Parses with `self` and if it fails, adds the message `msg` to the error.
637     ///
638     /// ```
639     /// # #![cfg(feature = "std")]
640     /// # extern crate combine;
641     /// # use combine::*;
642     /// # use combine::stream::easy;
643     /// # use combine::stream::position::{self, SourcePosition};
644     /// # fn main() {
645     /// let result = token('9')
646     ///     .message("Not a nine")
647     ///     .easy_parse(position::Stream::new("8"));
648     /// assert_eq!(result, Err(easy::Errors {
649     ///     position: SourcePosition::default(),
650     ///     errors: vec![
651     ///         easy::Error::Unexpected('8'.into()),
652     ///         easy::Error::Expected('9'.into()),
653     ///         easy::Error::Message("Not a nine".into())
654     ///     ]
655     /// }));
656     /// # }
657     /// ```
message<S>(self, msg: S) -> Message<Self, S> where Self: Sized, S: for<'s> ErrorInfo<'s, Input::Token, Input::Range>,658     fn message<S>(self, msg: S) -> Message<Self, S>
659     where
660         Self: Sized,
661         S: for<'s> ErrorInfo<'s, Input::Token, Input::Range>,
662     {
663         message(self, msg)
664     }
665 
666     /// Parses with `self` and if it fails without consuming any input any expected errors are
667     /// replaced by `msg`. `msg` is then used in error messages as "Expected `msg`".
668     ///
669     /// ```
670     /// # #![cfg(feature = "std")]
671     /// # extern crate combine;
672     /// # use combine::*;
673     /// # use combine::error;
674     /// # use combine::stream::easy;
675     /// # use combine::stream::position::{self, SourcePosition};
676     /// # fn main() {
677     /// let result = token('9')
678     ///     .expected("nine")
679     ///     .easy_parse(position::Stream::new("8"));
680     /// assert_eq!(result, Err(easy::Errors {
681     ///     position: SourcePosition::default(),
682     ///     errors: vec![
683     ///         easy::Error::Unexpected('8'.into()),
684     ///         easy::Error::Expected("nine".into())
685     ///     ]
686     /// }));
687     ///
688     /// let result = token('9')
689     ///     .expected(error::Format(format_args!("That is not a nine!")))
690     ///     .easy_parse(position::Stream::new("8"));
691     /// assert_eq!(result, Err(easy::Errors {
692     ///     position: SourcePosition::default(),
693     ///     errors: vec![
694     ///         easy::Error::Unexpected('8'.into()),
695     ///         easy::Error::Expected("That is not a nine!".to_string().into())
696     ///     ]
697     /// }));
698     /// # }
699     /// ```
expected<S>(self, msg: S) -> Expected<Self, S> where Self: Sized, S: for<'s> ErrorInfo<'s, Input::Token, Input::Range>,700     fn expected<S>(self, msg: S) -> Expected<Self, S>
701     where
702         Self: Sized,
703         S: for<'s> ErrorInfo<'s, Input::Token, Input::Range>,
704     {
705         expected(self, msg)
706     }
707 
708     /// Parses with `self`, if it fails without consuming any input any expected errors that would
709     /// otherwise be emitted by `self` are suppressed.
710     ///
711     /// ```
712     /// # #![cfg(feature = "std")]
713     /// # extern crate combine;
714     /// # use combine::*;
715     /// # use combine::stream::easy;
716     /// # use combine::stream::position::{self, SourcePosition};
717     /// # fn main() {
718     /// let result = token('9')
719     ///     .expected("nine")
720     ///     .silent()
721     ///     .easy_parse(position::Stream::new("8"));
722     /// assert_eq!(result, Err(easy::Errors {
723     ///     position: SourcePosition::default(),
724     ///     errors: vec![
725     ///         easy::Error::Unexpected('8'.into()),
726     ///     ]
727     /// }));
728     /// # }
729     /// ```
silent(self) -> Silent<Self> where Self: Sized,730     fn silent(self) -> Silent<Self>
731     where
732         Self: Sized,
733     {
734         silent(self)
735     }
736 
737     /// Parses with `self` and applies `f` on the result if `self` parses successfully.
738     /// `f` may optionally fail with an error which is automatically converted to a `ParseError`.
739     ///
740     /// ```
741     /// # extern crate combine;
742     /// # use combine::*;
743     /// # use combine::stream::position::{self, SourcePosition};
744     /// # use combine::parser::char::digit;
745     /// # fn main() {
746     /// let mut parser = many1(digit())
747     ///     .and_then(|s: String| s.parse::<i32>());
748     /// let result = parser.easy_parse(position::Stream::new("1234")).map(|(x, state)| (x, state.input));
749     /// assert_eq!(result, Ok((1234, "")));
750     /// let result = parser.easy_parse(position::Stream::new("999999999999999999999999"));
751     /// assert!(result.is_err());
752     /// // Errors are report as if they occurred at the start of the parse
753     /// assert_eq!(result.unwrap_err().position, SourcePosition { line: 1, column: 1 });
754     /// # }
755     /// ```
and_then<F, O, E>(self, f: F) -> AndThen<Self, F> where Self: Parser<Input> + Sized, F: FnMut(Self::Output) -> Result<O, E>, E: Into< <Input::Error as ParseError<Input::Token, Input::Range, Input::Position>>::StreamError, >,756     fn and_then<F, O, E>(self, f: F) -> AndThen<Self, F>
757     where
758         Self: Parser<Input> + Sized,
759         F: FnMut(Self::Output) -> Result<O, E>,
760         E: Into<
761             <Input::Error as ParseError<Input::Token, Input::Range, Input::Position>>::StreamError,
762         >,
763     {
764         and_then(self, f)
765     }
766 
767     /// Creates an iterator from a parser and a state. Can be used as an alternative to [`many`]
768     /// when collecting directly into a `Extend` type is not desirable.
769     ///
770     /// ```
771     /// # extern crate combine;
772     /// # use combine::*;
773     /// # use combine::parser::char::{char, digit};
774     /// # fn main() {
775     /// let mut buffer = String::new();
776     /// let number = parser(|input| {
777     ///     buffer.clear();
778     ///     let mut iter = digit().iter(input);
779     ///     buffer.extend(&mut iter);
780     ///     let i = buffer.parse::<i32>().unwrap();
781     ///     iter.into_result(i)
782     /// });
783     /// let result = sep_by(number, char(','))
784     ///     .parse("123,45,6");
785     /// assert_eq!(result, Ok((vec![123, 45, 6], "")));
786     /// # }
787     /// ```
788     ///
789     /// [`many`]: repeat::many
iter(self, input: &mut Input) -> Iter<'_, Input, Self, Self::PartialState, FirstMode> where Self: Parser<Input> + Sized,790     fn iter(self, input: &mut Input) -> Iter<'_, Input, Self, Self::PartialState, FirstMode>
791     where
792         Self: Parser<Input> + Sized,
793     {
794         Iter::new(self, FirstMode, input, Default::default())
795     }
796 
797     /// Creates an iterator from a parser and a state. Can be used as an alternative to [`many`]
798     /// when collecting directly into a `Extend` type is not desirable.
799     ///
800     /// ```
801     /// # extern crate combine;
802     /// # use combine::*;
803     /// # use combine::parser::char::{char, digit};
804     /// # fn main() {
805     /// let mut buffer = String::new();
806     /// let number = parser(|input| {
807     ///     buffer.clear();
808     ///     let mut iter = digit().iter(input);
809     ///     buffer.extend(&mut iter);
810     ///     let i = buffer.parse::<i32>().unwrap();
811     ///     iter.into_result(i)
812     /// });
813     /// let result = sep_by(number, char(','))
814     ///     .parse("123,45,6");
815     /// assert_eq!(result, Ok((vec![123, 45, 6], "")));
816     /// # }
817     /// ```
818     ///
819     /// [`many`]: repeat::many
partial_iter<'a, 's, M>( self, mode: M, input: &'a mut Input, partial_state: &'s mut Self::PartialState, ) -> Iter<'a, Input, Self, &'s mut Self::PartialState, M> where Self: Parser<Input> + Sized, M: ParseMode,820     fn partial_iter<'a, 's, M>(
821         self,
822         mode: M,
823         input: &'a mut Input,
824         partial_state: &'s mut Self::PartialState,
825     ) -> Iter<'a, Input, Self, &'s mut Self::PartialState, M>
826     where
827         Self: Parser<Input> + Sized,
828         M: ParseMode,
829     {
830         Iter::new(self, mode, input, partial_state)
831     }
832 
833     /// Turns the parser into a trait object by putting it in a `Box`. Can be used to easily
834     /// return parsers from functions without naming the type.
835     ///
836     /// ```
837     /// # use combine::*;
838     /// # fn main() {
839     /// fn test<'input, F>(
840     ///     c: char,
841     ///     f: F)
842     ///     -> Box<dyn Parser<&'input str, Output = (char, char), PartialState = ()> + 'input>
843     ///     where F: FnMut(char) -> bool + 'static
844     /// {
845     ///     combine::parser::combinator::no_partial((token(c), satisfy(f))).boxed()
846     /// }
847     /// let result = test('a', |c| c >= 'a' && c <= 'f')
848     ///     .parse("ac");
849     /// assert_eq!(result, Ok((('a', 'c'), "")));
850     /// # }
851     /// ```
852     #[cfg(feature = "alloc")]
853     #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
boxed<'a>( self, ) -> Box<dyn Parser<Input, Output = Self::Output, PartialState = Self::PartialState> + 'a> where Self: Sized + 'a,854     fn boxed<'a>(
855         self,
856     ) -> Box<dyn Parser<Input, Output = Self::Output, PartialState = Self::PartialState> + 'a>
857     where
858         Self: Sized + 'a,
859     {
860         Box::new(self)
861     }
862 
863     /// Wraps the parser into the [`Either`](combinator::Either) enum which allows combinators such as [`then`](Parser::then) to return
864     /// multiple different parser types (merging them to one)
865     ///
866     /// ```
867     /// # extern crate combine;
868     /// # use combine::*;
869     /// # use combine::parser::char::{digit, letter};
870     /// # fn main() {
871     /// let mut parser = any().then(|c|
872     ///     if c == '#' {
873     ///         skip_many(satisfy(|c| c != '\n'))
874     ///             .with(value("".to_string()))
875     ///             .left()
876     ///     } else {
877     ///         many1(letter())
878     ///             .map(move |mut s: String| { s.insert(0, c); s })
879     ///             .right()
880     ///     });
881     ///
882     /// let result = parser.parse("ac2");
883     /// assert_eq!(result, Ok(("ac".to_string(), "2")));
884     ///
885     /// let result = parser.parse("# ac2");
886     /// assert_eq!(result, Ok(("".to_string(), "")));
887     /// # }
888     /// ```
left<R>(self) -> Either<Self, R> where Self: Sized, R: Parser<Input, Output = Self::Output>,889     fn left<R>(self) -> Either<Self, R>
890     where
891         Self: Sized,
892         R: Parser<Input, Output = Self::Output>,
893     {
894         Either::Left(self)
895     }
896 
897     /// Wraps the parser into the [`Either`](combinator::Either) enum which allows combinators such as [`then`](Parser::then) to return
898     /// multiple different parser types (merging them to one)
899     ///
900     /// ```
901     /// # extern crate combine;
902     /// # use combine::*;
903     /// # use combine::parser::char::{digit, letter};
904     /// # fn main() {
905     /// let mut parser = any().then(|c|
906     ///     if c == '#' {
907     ///         skip_many(satisfy(|c| c != '\n'))
908     ///             .with(value("".to_string()))
909     ///             .left()
910     ///     } else {
911     ///         many1(letter())
912     ///             .map(move |mut s: String| { s.insert(0, c); s })
913     ///             .right()
914     ///     });
915     ///
916     /// let result = parser.parse("ac2");
917     /// assert_eq!(result, Ok(("ac".to_string(), "2")));
918     ///
919     /// let result = parser.parse("# ac2");
920     /// assert_eq!(result, Ok(("".to_string(), "")));
921     /// # }
922     /// ```
right<L>(self) -> Either<L, Self> where Self: Sized, L: Parser<Input, Output = Self::Output>,923     fn right<L>(self) -> Either<L, Self>
924     where
925         Self: Sized,
926         L: Parser<Input, Output = Self::Output>,
927     {
928         Either::Right(self)
929     }
930 
931     /// Marks errors produced inside the `self` parser with the span from the start of the parse to
932     /// the end of it.
933     ///
934     /// [`p.spanned()`]: ../trait.Parser.html#method.spanned
935     ///
936     /// ```
937     /// use combine::{*, parser::{char::string, combinator::spanned}};
938     /// use combine::stream::{easy, span};
939     ///
940     /// let input = "hel";
941     /// let result = spanned(string("hello")).parse(
942     ///     span::Stream::<_, easy::Errors<_, _, span::Span<_>>>::from(easy::Stream::from(input)),
943     /// );
944     /// assert!(result.is_err());
945     /// assert_eq!(
946     ///     result.unwrap_err().position.map(|p| p.translate_position(input)),
947     ///     span::Span { start: 0, end: 3 },
948     /// );
949     /// ```
spanned(self) -> Spanned<Self> where Self: Sized,950     fn spanned(self) -> Spanned<Self>
951     where
952         Self: Sized,
953     {
954         spanned(self)
955     }
956 }
957 
958 /// Provides the `easy_parse` method which provides good error messages by default
959 #[cfg(feature = "std")]
960 #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
961 pub trait EasyParser<Input: Stream>: Parser<crate::easy::Stream<Input>>
962 where
963     Input::Token: PartialEq,
964     Input::Range: PartialEq,
965 {
966     /// Entry point of the parser. Takes some input and tries to parse it, returning an easy to use
967     /// and format error if parsing did not succeed.
968     ///
969     /// Returns the parsed result and the remaining input if the parser succeeds, or a
970     /// This function wraps requires `Input == easy::Stream<Input>` which makes it return
971     /// return `easy::Errors` if an error occurs. Due to this wrapping it is recommended that the
972     /// parser `Self` is written with a generic input type.
973     ///
974     /// ```
975     /// # #[macro_use]
976     /// # extern crate combine;
977     ///
978     /// use combine::*;
979     /// use combine::parser::repeat::many1;
980     /// use combine::parser::char::letter;
981     ///
982     /// // Good!
983     /// parser!{
984     /// fn my_parser[Input]()(Input) -> String
985     ///     where [Input: Stream<Token = char>]
986     /// {
987     ///     many1::<String, _, _>(letter())
988     /// }
989     /// }
990     ///
991     /// // Won't compile with `easy_parse` since it is specialized on `&str`
992     /// parser!{
993     /// fn my_parser2['a]()(&'a str) -> String
994     ///     where [&'a str: Stream<Token = char, Range = &'a str>]
995     /// {
996     ///     many1(letter())
997     /// }
998     /// }
999     ///
1000     /// fn main() {
1001     ///     assert_eq!(my_parser().parse("abc"), Ok(("abc".to_string(), "")));
1002     ///     // Would fail to compile if uncommented
1003     ///     // my_parser2().parse("abc")
1004     /// }
1005     /// ```
1006     ///
1007     /// [`ParseError`]: struct.ParseError.html
easy_parse( &mut self, input: Input, ) -> Result< (<Self as Parser<crate::easy::Stream<Input>>>::Output, Input), crate::easy::ParseError<Input>, > where Input: Stream, crate::easy::Stream<Input>: StreamOnce< Token = Input::Token, Range = Input::Range, Error = crate::easy::ParseError<crate::easy::Stream<Input>>, Position = Input::Position, >, Input::Position: Default, Self: Sized + Parser<crate::easy::Stream<Input>>,1008     fn easy_parse(
1009         &mut self,
1010         input: Input,
1011     ) -> Result<
1012         (<Self as Parser<crate::easy::Stream<Input>>>::Output, Input),
1013         crate::easy::ParseError<Input>,
1014     >
1015     where
1016         Input: Stream,
1017         crate::easy::Stream<Input>: StreamOnce<
1018             Token = Input::Token,
1019             Range = Input::Range,
1020             Error = crate::easy::ParseError<crate::easy::Stream<Input>>,
1021             Position = Input::Position,
1022         >,
1023         Input::Position: Default,
1024         Self: Sized + Parser<crate::easy::Stream<Input>>,
1025     {
1026         let input = crate::easy::Stream(input);
1027         self.parse(input).map(|(v, input)| (v, input.0))
1028     }
1029 }
1030 
1031 #[cfg(feature = "std")]
1032 impl<Input, P> EasyParser<Input> for P
1033 where
1034     P: ?Sized + Parser<crate::easy::Stream<Input>>,
1035     Input: Stream,
1036     Input::Token: PartialEq,
1037     Input::Range: PartialEq,
1038 {
1039 }
1040 
1041 macro_rules! forward_deref {
1042     (Input) => {
1043         type Output = P::Output;
1044         type PartialState = P::PartialState;
1045 
1046         #[inline]
1047         fn parse_first(
1048             &mut self,
1049             input: &mut Input,
1050             state: &mut Self::PartialState,
1051         ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
1052             (**self).parse_first(input, state)
1053         }
1054 
1055         #[inline]
1056         fn parse_partial(
1057             &mut self,
1058             input: &mut Input,
1059             state: &mut Self::PartialState,
1060         ) -> ParseResult<Self::Output, <Input as StreamOnce>::Error> {
1061             (**self).parse_partial(input, state)
1062         }
1063 
1064         #[inline]
1065         fn add_error(&mut self, error: &mut Tracked<<Input as StreamOnce>::Error>) {
1066             (**self).add_error(error)
1067         }
1068 
1069         #[inline]
1070         fn add_committed_expected_error(
1071             &mut self,
1072             error: &mut Tracked<<Input as StreamOnce>::Error>,
1073         ) {
1074             (**self).add_committed_expected_error(error)
1075         }
1076 
1077         #[inline]
1078         fn parser_count(&self) -> ErrorOffset {
1079             (**self).parser_count()
1080         }
1081     };
1082 }
1083 
1084 impl<'a, P, Input> Parser<Input> for &'a mut P
1085 where
1086     P: ?Sized + Parser<Input>,
1087     Input: Stream,
1088 {
1089     forward_deref!(Input);
1090 }
1091 
1092 #[cfg(feature = "alloc")]
1093 impl<P, Input> Parser<Input> for Box<P>
1094 where
1095     P: ?Sized + Parser<Input>,
1096     Input: Stream,
1097 {
1098     forward_deref!(Input);
1099 }
1100 
1101 /// Internal API. May break without a semver bump
1102 #[doc(hidden)]
1103 /// Specifies whether the parser must check for partial state that must be resumed
1104 pub trait ParseMode: Copy {
1105     /// If `true` then the parser has no previous state to resume otherwise the parser *might* have
1106     /// state to resume which it must check.
is_first(self) -> bool1107     fn is_first(self) -> bool;
1108     /// Puts the mode into `first` parsing.
set_first(&mut self)1109     fn set_first(&mut self);
1110 
parse<P, Input>( self, parser: &mut P, input: &mut Input, state: &mut P::PartialState, ) -> ParseResult<P::Output, Input::Error> where P: Parser<Input>, Input: Stream1111     fn parse<P, Input>(
1112         self,
1113         parser: &mut P,
1114         input: &mut Input,
1115         state: &mut P::PartialState,
1116     ) -> ParseResult<P::Output, Input::Error>
1117     where
1118         P: Parser<Input>,
1119         Input: Stream;
1120 
1121     #[inline]
parse_committed<P, Input>( self, parser: &mut P, input: &mut Input, state: &mut P::PartialState, ) -> ParseResult<P::Output, <Input as StreamOnce>::Error> where P: Parser<Input>, Input: Stream,1122     fn parse_committed<P, Input>(
1123         self,
1124         parser: &mut P,
1125         input: &mut Input,
1126         state: &mut P::PartialState,
1127     ) -> ParseResult<P::Output, <Input as StreamOnce>::Error>
1128     where
1129         P: Parser<Input>,
1130         Input: Stream,
1131     {
1132         let before = input.checkpoint();
1133         let mut result = parser.parse_mode_impl(self, input, state);
1134         if let ParseResult::PeekErr(ref mut error) = result {
1135             ctry!(input.reset(before.clone()).committed());
1136             if let Ok(t) = input.uncons() {
1137                 ctry!(input.reset(before).committed());
1138                 error.error.add_unexpected(Token(t));
1139             } else {
1140                 error.error.add(StreamErrorFor::<Input>::end_of_input());
1141             }
1142             parser.add_error(error);
1143         }
1144         result
1145     }
1146 }
1147 
1148 /// Internal API. May break without a semver bump
1149 #[doc(hidden)]
1150 #[derive(Copy, Clone)]
1151 pub struct FirstMode;
1152 impl ParseMode for FirstMode {
1153     #[inline]
is_first(self) -> bool1154     fn is_first(self) -> bool {
1155         true
1156     }
1157     #[inline]
set_first(&mut self)1158     fn set_first(&mut self) {}
1159 
parse<P, Input>( self, parser: &mut P, input: &mut Input, state: &mut P::PartialState, ) -> ParseResult<P::Output, Input::Error> where P: Parser<Input>, Input: Stream,1160     fn parse<P, Input>(
1161         self,
1162         parser: &mut P,
1163         input: &mut Input,
1164         state: &mut P::PartialState,
1165     ) -> ParseResult<P::Output, Input::Error>
1166     where
1167         P: Parser<Input>,
1168         Input: Stream,
1169     {
1170         parser.parse_mode_impl(FirstMode, input, state)
1171     }
1172 }
1173 
1174 /// Internal API. May break without a semver bump
1175 #[doc(hidden)]
1176 #[derive(Copy, Clone, Default)]
1177 pub struct PartialMode {
1178     pub first: bool,
1179 }
1180 impl ParseMode for PartialMode {
1181     #[inline]
is_first(self) -> bool1182     fn is_first(self) -> bool {
1183         self.first
1184     }
1185 
1186     #[inline]
set_first(&mut self)1187     fn set_first(&mut self) {
1188         self.first = true;
1189     }
1190 
parse<P, Input>( self, parser: &mut P, input: &mut Input, state: &mut P::PartialState, ) -> ParseResult<P::Output, Input::Error> where P: Parser<Input>, Input: Stream,1191     fn parse<P, Input>(
1192         self,
1193         parser: &mut P,
1194         input: &mut Input,
1195         state: &mut P::PartialState,
1196     ) -> ParseResult<P::Output, Input::Error>
1197     where
1198         P: Parser<Input>,
1199         Input: Stream,
1200     {
1201         if self.is_first() {
1202             parser.parse_mode_impl(FirstMode, input, state)
1203         } else {
1204             parser.parse_mode_impl(self, input, state)
1205         }
1206     }
1207 }
1208