RosettaCodeData/Task/Tokenize-a-string-with-esca.../Factor/tokenize-a-string-with-esca...

24 lines
690 B
Factor

USING: accessors kernel lists literals namespaces
parser-combinators prettyprint sequences strings ;
SYMBOLS: esc sep ;
: set-chars ( m n -- ) [ sep set ] [ esc set ] bi* ;
: escape ( -- parser ) esc get 1token ;
: escaped ( -- parser ) escape any-char-parser &> ;
: separator ( -- parser ) sep get 1token ;
: character ( -- parser )
${ esc get sep get } [ member? not ] curry satisfy ;
: my-token ( -- parser ) escaped character <|> <*> ;
: token-list ( -- parser )
my-token separator list-of [ [ >string ] map ] <@ ;
: tokenize ( str sep-char esc-char -- seq )
set-chars token-list parse car parsed>> ;
"one^|uno||three^^^^|four^^^|^cuatro|"
CHAR: | CHAR: ^ tokenize .