REQUIRES: contrib/lazy-lists contrib/parser-combinators ; USING: kernel math strings sequences lazy-lists parser-combinators ; IN: sexp LAZY: 'lparens' ( -- parser ) "(" token ; LAZY: 'rparens' ( -- parser ) ")" token ; LAZY: 'identifier' ( -- parser ) [ [ blank? not ] keep [ digit? not ] keep [ CHAR: ( = not ] keep CHAR: ) = not and and and ] satisfy <+> [ >string ] <@ ; LAZY: 'digit' ( -- parser ) [ digit? ] satisfy [ digit> ] <@ ; LAZY: 'number' ( -- parser ) 'digit' <+> [ 0 [ swap 10 * + ] reduce ] <@ ; LAZY: 'atom' ( -- parser ) 'identifier' 'number' <|> ; LAZY: 'expr' ( -- parser ) 'atom' 'lparens' 'atom' 'expr' <|> sp <*> &> 'rparens' <& [ >quotation ] <@ <|> ; : reader ( input -- value ) 'expr' just some parse force ; : test1 ( -- value ) "(+ dfg 20 30)" 'expr' just some parse force ;