From 7cbf7ba7198d2320d294398aa0228106010fbb65 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 2 Dec 2007 15:55:44 -0500 Subject: [PATCH] Updates for parser-combinators --- .../parser-combinators.factor | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/extra/parser-combinators/parser-combinators.factor b/extra/parser-combinators/parser-combinators.factor index 7256ad18dd..874dedeb6f 100755 --- a/extra/parser-combinators/parser-combinators.factor +++ b/extra/parser-combinators/parser-combinators.factor @@ -290,18 +290,19 @@ LAZY: <(+)> ( parser -- parser ) LAZY: surrounded-by ( parser start end -- parser' ) [ token ] 2apply swapd pack ; -: predicates>cond ( seq -- quot ) - #! Takes an array of quotation predicates/objects and makes a cond - #! Makes a predicate of each obj like so: [ dup obj = ] - #! Leaves quotations alone - #! The cond returns a boolean, t if one of the predicates matches - [ - dup callable? [ [ = ] curry ] unless - [ dup ] swap compose [ drop t ] 2array - ] map { [ t ] [ drop f ] } add [ cond ] curry ; +: exactly-n ( parser n -- parser' ) + swap ; -GENERIC: parser>predicate ( obj -- quot ) +: at-most-n ( parser n -- parser' ) + dup zero? [ + 2drop epsilon + ] [ + 2dup exactly-n + -rot 1- at-most-n <|> + ] if ; -M: satisfy-parser parser>predicate ( obj -- quot ) - satisfy-parser-quot ; +: at-least-n ( parser n -- parser' ) + dupd exactly-n swap <*> <&> ; +: from-m-to-n ( parser m n -- parser' ) + >r [ exactly-n ] 2keep r> swap - at-most-n <&> ;