From 18217543d67eb877835969213658b707661ca22d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Tom=C3=A1s?= Date: Sat, 24 Oct 2026 13:46:07 -0300 Subject: Simplify many parser --- core.lisp | 24 ++++++++++-------------- 1 file 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))))) -- cgit v1.2.3