summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Thompson <davet@gnu.org>2015-08-10 15:47:33 -0400
committerDavid Thompson <davet@gnu.org>2015-08-10 15:47:33 -0400
commit69cb7aee1220e23ae7e1b2171b229c82f6a9c591 (patch)
tree10cf0f6a24949bafbc1da797f9649d6dfdbf16b2
parentf7fbfe2c91cb614a021440ae40378d3e95170d89 (diff)
Add parse-up-to.
-rw-r--r--parser-combinators.scm13
1 files changed, 13 insertions, 0 deletions
diff --git a/parser-combinators.scm b/parser-combinators.scm
index 4a3a3f8..e0522dd 100644
--- a/parser-combinators.scm
+++ b/parser-combinators.scm
@@ -46,6 +46,7 @@
parse-each
parse-zero-or-more
parse-one-or-more
+ parse-up-to
parse-maybe
parse))
@@ -158,6 +159,18 @@ parsers succeed."
(($ <parse-result> value stream)
(loop stream (cons value result)))))))
+(define (parse-up-to n parser)
+ "Parse using PARSER at most N times."
+ (lambda (stream)
+ (let loop ((stream stream)
+ (m 0))
+ (if (= m n)
+ '()
+ (match (parser stream)
+ ((? parse-failure?) '())
+ (($ <parse-result> value stream)
+ (cons value (loop stream (1+ m)))))))))
+
(define* (parse-maybe parser #:optional (default #f))
(lambda (stream)
(match (parser stream)