parsers: Add parse-maybe.
authorDavid Thompson <dthompson2@worcester.edu>
Mon, 19 Oct 2015 13:10:31 +0000 (09:10 -0400)
committerDavid Thompson <dthompson2@worcester.edu>
Mon, 19 Oct 2015 13:10:31 +0000 (09:10 -0400)
* syntax-highlight/parsers.scm (parse-maybe): New procedure.

syntax-highlight/parsers.scm

index 31c17ae..5d08e45 100644 (file)
@@ -38,6 +38,7 @@
             parse-both
             parse-any
             parse-each
+            parse-maybe
             parse-many
             parse-string
             parse-char-set
@@ -117,6 +118,16 @@ parser fails without consuming any input if any parser in PARSERS
 fails."
   (fold-right parse-both (parse-return '()) parsers))
 
+(define (parse-maybe parser)
+  "Create a parser that always succeeds, but tries to use PARSER.  If
+PARSER succeeds, its result is returned, otherwise the empty string is
+returned without consuming any input."
+  (lambda (stream)
+    (let-values (((result remaining) (parser stream)))
+      (if result
+          (values result remaining)
+          (values "" stream)))))
+
 (define (parse-many parser)
   "Create a parser that uses PARSER as many times as possible until it
 fails and return the results of each successful parse in a list.  This