diff options
author | Juan Manuel Tomás <jtomas1815@gmail.com> | 2025-06-15 03:49:14 -0300 |
---|---|---|
committer | Juan Manuel Tomás <jtomas1815@gmail.com> | 2025-06-15 03:49:14 -0300 |
commit | 66b6d675055eb8a5017376eb6f43d609887d1289 (patch) | |
tree | 053802e3de74468bcc8f07e5e6e1628de2e9c4e4 /main.lisp | |
parent | da008e637b5bff56fed8dfbacc2adabc4bca18b1 (diff) | |
download | monparser-66b6d675055eb8a5017376eb6f43d609887d1289.tar.gz monparser-66b6d675055eb8a5017376eb6f43d609887d1289.zip |
Update parser interface
Diffstat (limited to 'main.lisp')
-rw-r--r-- | main.lisp | 19 |
1 files changed, 15 insertions, 4 deletions
@@ -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))))) |