@@ -589,4 +589,49 @@ fn main() {
589589}
590590```
591591
592- An example of the peeking usage is available in the [ expression] ( examples/expression.rs ) example.
592+ An example of the peeking usage is available in the [ expression] ( examples/expression.rs ) example.
593+
594+ ## Separated List
595+
596+ The ` SeparatedList ` component is used to parse a list of elements separated by a separator.
597+
598+ If you have this expression: "1 + 2 + 3 + 4", you want to get all the numbers.
599+
600+ The data are separated by the ` + ` pattern.
601+
602+ The ` SeparatedList ` takes two ` Visitor ` as type parameters:
603+
604+ - The element visitor : the one that will be used to parse each element of the list
605+ - The separator visitor : the one that will be used to parse the separator between each element of the list
606+
607+ Once one of parsers fails, the ` SeparatedList ` will stop parsing the list and return the result.
608+
609+ ``` rust
610+ use noa_parser :: bytes :: primitives :: number :: Number ;
611+ use noa_parser :: bytes :: token :: Token ;
612+ use noa_parser :: errors :: ParseResult ;
613+ use noa_parser :: recognizer :: recognize;
614+ use noa_parser :: scanner :: Scanner ;
615+ use noa_parser :: separated_list :: SeparatedList ;
616+ use noa_parser :: visitor :: Visitor ;
617+
618+ #[derive(Debug )]
619+ struct Separator ;
620+
621+ impl <'a > Visitor <'a , u8 > for Separator {
622+ fn accept (scanner : & mut noa_parser :: scanner :: Scanner <u8 >) -> ParseResult <Self > {
623+ recognize (Token :: Tilde , scanner )? ;
624+ recognize (Token :: Tilde , scanner )? ;
625+ recognize (Token :: Tilde , scanner )? ;
626+ Ok (Separator )
627+ }
628+ }
629+
630+ fn main () {
631+ let data = b " 1~~~2~~~3~~~4" ;
632+ let mut scanner = Scanner :: new (data );
633+ let result =
634+ SeparatedList :: <u8 , Number <usize >, Separator >:: accept (& mut scanner ). map (| x | x . data);
635+ println! (" {:?}" , result ); // Ok([Number(1), Number(2), Number(3), Number(4)])
636+ }
637+ ```
0 commit comments