Struct chumsky::combinator::SeparatedBy
source · pub struct SeparatedBy<A, B, U> { /* private fields */ }
Expand description
See Parser::separated_by
.
Implementations§
source§impl<A, B, U> SeparatedBy<A, B, U>
impl<A, B, U> SeparatedBy<A, B, U>
sourcepub fn allow_leading(self) -> Self
pub fn allow_leading(self) -> Self
Allow a leading separator to appear before the first item.
Note that even if no items are parsed, a leading separator is permitted.
Examples
let r#enum = text::keyword::<_, _, Simple<char>>("enum")
.padded()
.ignore_then(text::ident()
.padded()
.separated_by(just('|'))
.allow_leading());
assert_eq!(r#enum.parse("enum True | False"), Ok(vec!["True".to_string(), "False".to_string()]));
assert_eq!(r#enum.parse("
enum
| True
| False
"), Ok(vec!["True".to_string(), "False".to_string()]));
sourcepub fn allow_trailing(self) -> Self
pub fn allow_trailing(self) -> Self
Allow a trailing separator to appear after the last item.
Note that if no items are parsed, no leading separator is permitted.
Examples
let numbers = text::int::<_, Simple<char>>(10)
.padded()
.separated_by(just(','))
.allow_trailing()
.delimited_by(just('('), just(')'));
assert_eq!(numbers.parse("(1, 2)"), Ok(vec!["1".to_string(), "2".to_string()]));
assert_eq!(numbers.parse("(1, 2,)"), Ok(vec!["1".to_string(), "2".to_string()]));
sourcepub fn at_least(self, n: usize) -> Self
pub fn at_least(self, n: usize) -> Self
Require that the pattern appear at least a minimum number of times.
let numbers = just::<_, _, Simple<char>>('-')
.separated_by(just('.'))
.at_least(2);
assert!(numbers.parse("").is_err());
assert!(numbers.parse("-").is_err());
assert_eq!(numbers.parse("-.-"), Ok(vec!['-', '-']));
sourcepub fn at_most(self, n: usize) -> Self
pub fn at_most(self, n: usize) -> Self
Require that the pattern appear at most a maximum number of times.
let row_4 = text::int::<_, Simple<char>>(10)
.padded()
.separated_by(just(','))
.at_most(4);
let matrix_4x4 = row_4
.separated_by(just(','))
.at_most(4);
assert_eq!(
matrix_4x4.parse("0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15"),
Ok(vec![
vec!["0".to_string(), "1".to_string(), "2".to_string(), "3".to_string()],
vec!["4".to_string(), "5".to_string(), "6".to_string(), "7".to_string()],
vec!["8".to_string(), "9".to_string(), "10".to_string(), "11".to_string()],
vec!["12".to_string(), "13".to_string(), "14".to_string(), "15".to_string()],
]),
);
sourcepub fn exactly(self, n: usize) -> Self
pub fn exactly(self, n: usize) -> Self
Require that the pattern appear exactly the given number of times.
let coordinate_3d = text::int::<_, Simple<char>>(10)
.padded()
.separated_by(just(','))
.exactly(3)
.then_ignore(end());
// Not enough elements
assert!(coordinate_3d.parse("4, 3").is_err());
// Too many elements
assert!(coordinate_3d.parse("7, 2, 13, 4").is_err());
// Just the right number of elements
assert_eq!(coordinate_3d.parse("5, 0, 12"), Ok(vec!["5".to_string(), "0".to_string(), "12".to_string()]));
Trait Implementations§
source§impl<I: Clone, O, U, A: Parser<I, O, Error = E>, B: Parser<I, U, Error = E>, E: Error<I>> Parser<I, Vec<O, Global>> for SeparatedBy<A, B, U>
impl<I: Clone, O, U, A: Parser<I, O, Error = E>, B: Parser<I, U, Error = E>, E: Error<I>> Parser<I, Vec<O, Global>> for SeparatedBy<A, B, U>
source§fn parse_recovery<'a, Iter, S>(
&self,
stream: S
) -> (Option<O>, Vec<Self::Error>)where
Self: Sized,
Iter: Iterator<Item = (I, <Self::Error as Error<I>>::Span)> + 'a,
S: Into<Stream<'a, I, <Self::Error as Error<I>>::Span, Iter>>,
fn parse_recovery<'a, Iter, S>( &self, stream: S ) -> (Option<O>, Vec<Self::Error>)where Self: Sized, Iter: Iterator<Item = (I, <Self::Error as Error<I>>::Span)> + 'a, S: Into<Stream<'a, I, <Self::Error as Error<I>>::Span, Iter>>,
Parse a stream of tokens, yielding an output if possible, and any errors encountered along the way. Read more
source§fn parse_recovery_verbose<'a, Iter, S>(
&self,
stream: S
) -> (Option<O>, Vec<Self::Error>)where
Self: Sized,
Iter: Iterator<Item = (I, <Self::Error as Error<I>>::Span)> + 'a,
S: Into<Stream<'a, I, <Self::Error as Error<I>>::Span, Iter>>,
fn parse_recovery_verbose<'a, Iter, S>( &self, stream: S ) -> (Option<O>, Vec<Self::Error>)where Self: Sized, Iter: Iterator<Item = (I, <Self::Error as Error<I>>::Span)> + 'a, S: Into<Stream<'a, I, <Self::Error as Error<I>>::Span, Iter>>,
Parse a stream of tokens, yielding an output if possible, and any errors encountered along the way. Unlike
Parser::parse_recovery
, this function will produce verbose debugging output as it executes. Read moresource§fn parse<'a, Iter, S>(&self, stream: S) -> Result<O, Vec<Self::Error>>where
Self: Sized,
Iter: Iterator<Item = (I, <Self::Error as Error<I>>::Span)> + 'a,
S: Into<Stream<'a, I, <Self::Error as Error<I>>::Span, Iter>>,
fn parse<'a, Iter, S>(&self, stream: S) -> Result<O, Vec<Self::Error>>where Self: Sized, Iter: Iterator<Item = (I, <Self::Error as Error<I>>::Span)> + 'a, S: Into<Stream<'a, I, <Self::Error as Error<I>>::Span, Iter>>,
Parse a stream of tokens, yielding an output or any errors that were encountered along the way. Read more
source§fn debug<T>(self, x: T) -> Debug<Self>where
Self: Sized,
T: Display + 'static,
fn debug<T>(self, x: T) -> Debug<Self>where Self: Sized, T: Display + 'static,
Include this parser in the debugging output produced by
Parser::parse_recovery_verbose
. Read moresource§fn map<U, F>(self, f: F) -> Map<Self, F, O>where
Self: Sized,
F: Fn(O) -> U,
fn map<U, F>(self, f: F) -> Map<Self, F, O>where Self: Sized, F: Fn(O) -> U,
Map the output of this parser to another value. Read more
source§fn map_with_span<U, F>(self, f: F) -> MapWithSpan<Self, F, O>where
Self: Sized,
F: Fn(O, <Self::Error as Error<I>>::Span) -> U,
fn map_with_span<U, F>(self, f: F) -> MapWithSpan<Self, F, O>where Self: Sized, F: Fn(O, <Self::Error as Error<I>>::Span) -> U,
Map the output of this parser to another value, making use of the pattern’s span when doing so. Read more
source§fn map_err<F>(self, f: F) -> MapErr<Self, F>where
Self: Sized,
F: Fn(Self::Error) -> Self::Error,
fn map_err<F>(self, f: F) -> MapErr<Self, F>where Self: Sized, F: Fn(Self::Error) -> Self::Error,
Map the primary error of this parser to another value. Read more
source§fn or_else<F>(self, f: F) -> OrElse<Self, F>where
Self: Sized,
F: Fn(Self::Error) -> Result<O, Self::Error>,
fn or_else<F>(self, f: F) -> OrElse<Self, F>where Self: Sized, F: Fn(Self::Error) -> Result<O, Self::Error>,
source§fn map_err_with_span<F>(self, f: F) -> MapErrWithSpan<Self, F>where
Self: Sized,
F: Fn(Self::Error, <Self::Error as Error<I>>::Span) -> Self::Error,
fn map_err_with_span<F>(self, f: F) -> MapErrWithSpan<Self, F>where Self: Sized, F: Fn(Self::Error, <Self::Error as Error<I>>::Span) -> Self::Error,
Map the primary error of this parser to another value, making use of the span from the start of the attempted
to the point at which the error was encountered. Read more
source§fn try_map<U, F>(self, f: F) -> TryMap<Self, F, O>where
Self: Sized,
F: Fn(O, <Self::Error as Error<I>>::Span) -> Result<U, Self::Error>,
fn try_map<U, F>(self, f: F) -> TryMap<Self, F, O>where Self: Sized, F: Fn(O, <Self::Error as Error<I>>::Span) -> Result<U, Self::Error>,
After a successful parse, apply a fallible function to the output. If the function produces an error, treat it
as a parsing error. Read more
source§fn validate<F, U>(self, f: F) -> Validate<Self, O, F>where
Self: Sized,
F: Fn(O, <Self::Error as Error<I>>::Span, &mut dyn FnMut(Self::Error)) -> U,
fn validate<F, U>(self, f: F) -> Validate<Self, O, F>where Self: Sized, F: Fn(O, <Self::Error as Error<I>>::Span, &mut dyn FnMut(Self::Error)) -> U,
Validate an output, producing non-terminal errors if it does not fulfil certain criteria. Read more
source§fn labelled<L>(self, label: L) -> Label<Self, L>where
Self: Sized,
L: Into<<Self::Error as Error<I>>::Label> + Clone,
fn labelled<L>(self, label: L) -> Label<Self, L>where Self: Sized, L: Into<<Self::Error as Error<I>>::Label> + Clone,
Label the pattern parsed by this parser for more useful error messages. Read more
source§fn to<U>(self, x: U) -> To<Self, O, U>where
Self: Sized,
U: Clone,
fn to<U>(self, x: U) -> To<Self, O, U>where Self: Sized, U: Clone,
Transform all outputs of this parser to a pretermined value. Read more
source§fn foldl<A, B, F>(self, f: F) -> Foldl<Self, F, A, B>where
Self: Parser<I, (A, B)> + Sized,
B: IntoIterator,
F: Fn(A, B::Item) -> A,
fn foldl<A, B, F>(self, f: F) -> Foldl<Self, F, A, B>where Self: Parser<I, (A, B)> + Sized, B: IntoIterator, F: Fn(A, B::Item) -> A,
Left-fold the output of the parser into a single value. Read more
source§fn foldr<'a, A, B, F>(self, f: F) -> Foldr<Self, F, A, B>where
Self: Parser<I, (A, B)> + Sized,
A: IntoIterator,
A::IntoIter: DoubleEndedIterator,
F: Fn(A::Item, B) -> B + 'a,
fn foldr<'a, A, B, F>(self, f: F) -> Foldr<Self, F, A, B>where Self: Parser<I, (A, B)> + Sized, A: IntoIterator, A::IntoIter: DoubleEndedIterator, F: Fn(A::Item, B) -> B + 'a,
Right-fold the output of the parser into a single value. Read more
source§fn ignored(self) -> Ignored<Self, O>where
Self: Sized,
fn ignored(self) -> Ignored<Self, O>where Self: Sized,
Ignore the output of this parser, yielding
()
as an output instead. Read moresource§fn collect<C>(self) -> Map<Self, fn(_: O) -> C, O>where
Self: Sized,
O: IntoIterator,
C: FromIterator<O::Item>,
fn collect<C>(self) -> Map<Self, fn(_: O) -> C, O>where Self: Sized, O: IntoIterator, C: FromIterator<O::Item>,
Collect the output of this parser into a type implementing
FromIterator
. Read moresource§fn then<U, P>(self, other: P) -> Then<Self, P>where
Self: Sized,
P: Parser<I, U, Error = Self::Error>,
fn then<U, P>(self, other: P) -> Then<Self, P>where Self: Sized, P: Parser<I, U, Error = Self::Error>,
Parse one thing and then another thing, yielding a tuple of the two outputs. Read more
source§fn then_with<U, P, F: Fn(O) -> P>(
self,
other: F
) -> ThenWith<I, O, U, Self, P, F>where
Self: Sized,
P: Parser<I, U, Error = Self::Error>,
fn then_with<U, P, F: Fn(O) -> P>( self, other: F ) -> ThenWith<I, O, U, Self, P, F>where Self: Sized, P: Parser<I, U, Error = Self::Error>,
Parse one thing and then another thing, creating the second parser from the result of
the first. If you only have a couple cases to handle, prefer
Parser::or
. Read moresource§fn chain<T, U, P>(
self,
other: P
) -> Map<Then<Self, P>, fn(_: (O, U)) -> Vec<T>, (O, U)>where
Self: Sized,
U: Chain<T>,
O: Chain<T>,
P: Parser<I, U, Error = Self::Error>,
fn chain<T, U, P>( self, other: P ) -> Map<Then<Self, P>, fn(_: (O, U)) -> Vec<T>, (O, U)>where Self: Sized, U: Chain<T>, O: Chain<T>, P: Parser<I, U, Error = Self::Error>,
source§fn flatten<T, Inner>(self) -> Map<Self, fn(_: O) -> Vec<T>, O>where
Self: Sized,
O: IntoIterator<Item = Inner>,
Inner: IntoIterator<Item = T>,
fn flatten<T, Inner>(self) -> Map<Self, fn(_: O) -> Vec<T>, O>where Self: Sized, O: IntoIterator<Item = Inner>, Inner: IntoIterator<Item = T>,
Flatten a nested collection. Read more
source§fn ignore_then<U, P>(self, other: P) -> IgnoreThen<Self, P, O, U>where
Self: Sized,
P: Parser<I, U, Error = Self::Error>,
fn ignore_then<U, P>(self, other: P) -> IgnoreThen<Self, P, O, U>where Self: Sized, P: Parser<I, U, Error = Self::Error>,
Parse one thing and then another thing, yielding only the output of the latter. Read more
source§fn then_ignore<U, P>(self, other: P) -> ThenIgnore<Self, P, O, U>where
Self: Sized,
P: Parser<I, U, Error = Self::Error>,
fn then_ignore<U, P>(self, other: P) -> ThenIgnore<Self, P, O, U>where Self: Sized, P: Parser<I, U, Error = Self::Error>,
Parse one thing and then another thing, yielding only the output of the former. Read more
source§fn padded_by<U, P>(
self,
other: P
) -> ThenIgnore<IgnoreThen<P, Self, U, O>, P, O, U>where
Self: Sized,
P: Parser<I, U, Error = Self::Error> + Clone,
fn padded_by<U, P>( self, other: P ) -> ThenIgnore<IgnoreThen<P, Self, U, O>, P, O, U>where Self: Sized, P: Parser<I, U, Error = Self::Error> + Clone,
Parse a pattern, but with an instance of another pattern on either end, yielding the output of the inner. Read more
source§fn delimited_by<U, V, L, R>(
self,
start: L,
end: R
) -> DelimitedBy<Self, L, R, U, V>where
Self: Sized,
L: Parser<I, U, Error = Self::Error>,
R: Parser<I, V, Error = Self::Error>,
fn delimited_by<U, V, L, R>( self, start: L, end: R ) -> DelimitedBy<Self, L, R, U, V>where Self: Sized, L: Parser<I, U, Error = Self::Error>, R: Parser<I, V, Error = Self::Error>,
Parse the pattern surrounded by the given delimiters. Read more
source§fn or<P>(self, other: P) -> Or<Self, P>where
Self: Sized,
P: Parser<I, O, Error = Self::Error>,
fn or<P>(self, other: P) -> Or<Self, P>where Self: Sized, P: Parser<I, O, Error = Self::Error>,
Parse one thing or, on failure, another thing. Read more
source§fn recover_with<S>(self, strategy: S) -> Recovery<Self, S>where
Self: Sized,
S: Strategy<I, O, Self::Error>,
fn recover_with<S>(self, strategy: S) -> Recovery<Self, S>where Self: Sized, S: Strategy<I, O, Self::Error>,
Apply a fallback recovery strategy to this parser should it fail. Read more
source§fn or_not(self) -> OrNot<Self>where
Self: Sized,
fn or_not(self) -> OrNot<Self>where Self: Sized,
Attempt to parse something, but only if it exists. Read more
source§fn not(self) -> Not<Self, O>where
Self: Sized,
fn not(self) -> Not<Self, O>where Self: Sized,
Parses a single token if, and only if, the pattern fails to parse. Read more
source§fn repeated(self) -> Repeated<Self>where
Self: Sized,
fn repeated(self) -> Repeated<Self>where Self: Sized,
Parse a pattern any number of times (including zero times). Read more
source§fn separated_by<U, P>(self, other: P) -> SeparatedBy<Self, P, U>where
Self: Sized,
P: Parser<I, U, Error = Self::Error>,
fn separated_by<U, P>(self, other: P) -> SeparatedBy<Self, P, U>where Self: Sized, P: Parser<I, U, Error = Self::Error>,
Parse a pattern, separated by another, any number of times. Read more
source§fn rewind(self) -> Rewind<Self>where
Self: Sized,
fn rewind(self) -> Rewind<Self>where Self: Sized,
Parse a pattern. Afterwards, the input stream will be rewound to its original state, as if parsing had not
occurred. Read more