diff options
author | David Thompson <davet@gnu.org> | 2015-08-10 15:47:33 -0400 |
---|---|---|
committer | David Thompson <davet@gnu.org> | 2015-08-10 15:47:33 -0400 |
commit | 69cb7aee1220e23ae7e1b2171b229c82f6a9c591 (patch) | |
tree | 10cf0f6a24949bafbc1da797f9649d6dfdbf16b2 | |
parent | f7fbfe2c91cb614a021440ae40378d3e95170d89 (diff) |
Add parse-up-to.
-rw-r--r-- | parser-combinators.scm | 13 |
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) |