summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parser.lisp11
1 files changed, 8 insertions, 3 deletions
diff --git a/parser.lisp b/parser.lisp
index 2fe6f67..b231f14 100644
--- a/parser.lisp
+++ b/parser.lisp
@@ -85,14 +85,19 @@
(declare (ignore lazy))
(labels ((one-of-rec (parsers)
(let ((intermediate-parsers '())
- (result (make-failure :place input
- :message "Exausted options.")))
+ (result nil))
(dolist (p parsers)
(let ((r (funcall p input (> (length parsers) 1))))
(cond ((functionp r)
(push r intermediate-parsers))
((parsing-p r)
- (setf result r)))))
+ (when (or (not (parsing-p result))
+ (> (cursor (parsing-input r))
+ (cursor (parsing-input result))))
+ (setf result r)))
+ ((failure-p r)
+ (when (failure-p result)
+ (setf result r))))))
(if intermediate-parsers
(one-of-rec intermediate-parsers)
result))))