summaryrefslogtreecommitdiff
path: root/main.lisp
diff options
context:
space:
mode:
authorJuan Manuel Tomás <jtomas1815@gmail.com>2025-06-15 03:49:14 -0300
committerJuan Manuel Tomás <jtomas1815@gmail.com>2025-06-15 03:49:14 -0300
commit66b6d675055eb8a5017376eb6f43d609887d1289 (patch)
tree053802e3de74468bcc8f07e5e6e1628de2e9c4e4 /main.lisp
parentda008e637b5bff56fed8dfbacc2adabc4bca18b1 (diff)
downloadmonparser-66b6d675055eb8a5017376eb6f43d609887d1289.tar.gz
monparser-66b6d675055eb8a5017376eb6f43d609887d1289.zip
Update parser interface
Diffstat (limited to 'main.lisp')
-rw-r--r--main.lisp19
1 files changed, 15 insertions, 4 deletions
diff --git a/main.lisp b/main.lisp
index 197f1b2..f802d25 100644
--- a/main.lisp
+++ b/main.lisp
@@ -6,9 +6,20 @@
:data data))))
(if (parsing-p result)
(let ((finished? (not (has-data? (parsing-left result)))))
- (values result finished?))
+ (values (parsing-tree result) finished?))
result)))
-(defmethod print-object ((obj failure) stream)
- (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))))
+(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)))))