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