diff options
Diffstat (limited to 'core.lisp')
| -rw-r--r-- | core.lisp | 24 |
1 files changed, 10 insertions, 14 deletions
@@ -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))))) |
