(in-package #:monparser) (defstruct parsing tree left) (defstruct failure place (message "") (priority 0)) (defmethod print-object ((obj failure) stream) (if (failure-place obj) (multiple-value-bind (line column) (line-and-column (failure-place obj)) (format stream "~a:~a: ~a~&~a~&" line column (failure-message obj) (failure-place obj))) (format stream "~a~&" (failure-message obj)))) (defun new (tree) (lambda (input) (make-parsing :tree tree :left input))) (defun bind (parser f) (lambda (input) (let ((r (funcall parser input))) (cond ((parsing-p r) (funcall (funcall f (parsing-tree r) input) (parsing-left r))) ((failure-p r) r) (t (error (format nil "Invalid return value: ~a" r)))))))