diff options
Diffstat (limited to 'base.lisp')
-rw-r--r-- | base.lisp | 42 |
1 files changed, 9 insertions, 33 deletions
@@ -2,53 +2,29 @@ (defstruct parsing tree - left - limit) + left) (defstruct failure place message) -(defun lazy-parsing-p (r) - (or (functionp r) - (parsing-p r))) - (defun new (tree) - (lambda (input &key limit lazy) - (declare (ignore limit lazy)) + (lambda (input &key lazy) + (declare (ignore lazy)) (make-parsing :tree tree :left input))) -(defun bind (parser f &key (greedy t)) - (lambda (input &key limit lazy) - (let (r) - (if greedy - (setf r (funcall parser input :limit limit)) - (let ((next-parser (funcall f nil input)) - (inner-limit -1)) - (do ((sweep-input input (advance sweep-input))) - ((or (if limit - (> (cursor-distance sweep-input input) limit) - (not (has-data? sweep-input))) - (> inner-limit -1)) - nil) - (when (lazy-parsing-p (funcall next-parser sweep-input :lazy t)) - (setf inner-limit (cursor-distance sweep-input input)) - (when limit (decf limit inner-limit)))) - (if (< inner-limit 0) - (setf r (make-failure :place input - :message "Reached end of input while sweeping.")) - (setf r (funcall parser input :limit inner-limit))))) +(defun bind (parser f) + (lambda (input &key lazy) + (let ((r (funcall parser input))) (cond ((parsing-p r) (if lazy - (lambda (ignored-input &key lazy limit) + (lambda (ignored-input &key lazy) (declare (ignore ignored-input)) (funcall (funcall f (parsing-tree r) input) (parsing-left r) - :lazy lazy - :limit (if greedy (parsing-limit r) limit))) + :lazy lazy)) (funcall (funcall f (parsing-tree r) input) - (parsing-left r) - :limit (if greedy (parsing-limit r) limit)))) + (parsing-left r)))) ((failure-p r) r) (t (error (format nil "Invalid return value: ~a" r))))))) |