summaryrefslogtreecommitdiff
path: root/core.lisp
diff options
context:
space:
mode:
authorJuan Manuel Tomás <jtomas1815@gmail.com>2026-10-24 13:46:07 -0300
committerJuan Manuel Tomás <jtomas1815@gmail.com>2026-10-24 13:46:07 -0300
commit18217543d67eb877835969213658b707661ca22d (patch)
tree132d26c1f22410b6f252adf01564d7d89fd3db16 /core.lisp
parenteb805f9412c30531d9e051afbf8727b72a27f933 (diff)
downloadmonparser-18217543d67eb877835969213658b707661ca22d.tar.gz
monparser-18217543d67eb877835969213658b707661ca22d.zip
Simplify many parser
Diffstat (limited to 'core.lisp')
-rw-r--r--core.lisp24
1 files changed, 10 insertions, 14 deletions
diff --git a/core.lisp b/core.lisp
index 21e18fc..502507b 100644
--- a/core.lisp
+++ b/core.lisp
@@ -72,19 +72,15 @@
(declaim (ftype (function (parser &key (:all t)) parser) many))
(defun many (p &key all)
(lambda (input)
- (let* ((result '()))
- (do ((r (funcall p (cursor-rebase input))
- (funcall p (cursor-rebase (result-place r)))))
+ (let ((result '()))
+ (do ((r (funcall p (cursor-rebase input)) (funcall p (result-place r))))
((or (failure-p r)
(cursor-at-start? (result-place r)))
- nil)
- (push r result))
- (cond ((not result)
- (make-failure :place input
- :message "No matches."))
- ((and all (cursor-has-data? (result-place (first result))))
- (make-failure :place (result-place (first result))
- :message "Input not exausted."
- :priority 1))
- (t (make-parsing :place (result-place (first result))
- :tree (reverse (mapcar (lambda (x) (parsing-tree x)) result))))))))
+ (cond ((or (null result)
+ (and all (cursor-has-data? (result-place (first result)))))
+ (if (failure-p r)
+ r
+ (make-failure :place input :message "No matches.")))
+ (t (make-parsing :place (result-place (first result))
+ :tree (reverse (mapcar (lambda (x) (parsing-tree x)) result))))))
+ (push r result)))))