summaryrefslogtreecommitdiff
path: root/base.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'base.lisp')
-rw-r--r--base.lisp12
1 files changed, 11 insertions, 1 deletions
diff --git a/base.lisp b/base.lisp
index 5531562..d829e6e 100644
--- a/base.lisp
+++ b/base.lisp
@@ -22,13 +22,23 @@
(defun parse (parser data)
(funcall parser (make-cursor :data data)))
+(declaim (ftype (function (parser string) parser) append-on-failure))
+(defun append-on-failure (p message)
+ (lambda (input)
+ (let ((result (funcall p input)))
+ (if (failure-p result)
+ (make-failure :place (result-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 (and (listp args) (every #'symbolp args))
(let (definition)
(when (= (length args) 0)
(push `(defparameter ,name (,name)) definition))
- (push `(defun ,name (,@args) ,parser)
+ (push `(defun ,name (,@args) (append-on-failure ,parser ,message))
definition)
(push 'progn definition)
definition)