From 66b6d675055eb8a5017376eb6f43d609887d1289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Manuel=20Tom=C3=A1s?= Date: Sun, 15 Jun 2025 03:49:14 -0300 Subject: Update parser interface --- main.lisp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'main.lisp') 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))))) -- cgit v1.2.3