(in-package #:monparser) (defun parse (parser data) (let* ((result (funcall parser (make-instance 'parser-input :data data)))) (if (parsing-p result) (let ((finished? (not (has-data? (parsing-left result))))) (values (parsing-tree result) finished?)) result))) (defun append-on-failure (p message) (lambda (input) (let ((result (funcall p input))) (if (failure-p result) (make-failure :place (failure-place result) :message (concatenate 'string message (failure-message result)) :priority (failure-priority result)) result)))) (defmacro defparser (name args parser) (let ((message (format nil "In ~a:~&" name))) (if (null args) `(defparameter ,name (append-on-failure ,parser ,message)) `(defun ,name ,args (append-on-failure ,parser ,message)))))