Add parse-up-to.
authorDavid Thompson <davet@gnu.org>
Mon, 10 Aug 2015 19:47:33 +0000 (15:47 -0400)
committerDavid Thompson <davet@gnu.org>
Mon, 10 Aug 2015 19:47:33 +0000 (15:47 -0400)
parser-combinators.scm

index 4a3a3f8..e0522dd 100644 (file)
@@ -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)