diff options
author | Juan Manuel Tomás <jtomas1815@gmail.com> | 2024-10-13 00:51:57 -0300 |
---|---|---|
committer | Juan Manuel Tomás <jtomas1815@gmail.com> | 2024-10-13 00:51:57 -0300 |
commit | 1af10ddc10e35805c6723d7a2a85d7e3768497f8 (patch) | |
tree | 10cb209d714c339b1bc99c900eca98424ef31c11 | |
parent | 7a6f4586c2e83ffcdb5a8b7b2c5591f6e80e038f (diff) | |
download | monparser-1af10ddc10e35805c6723d7a2a85d7e3768497f8.tar.gz monparser-1af10ddc10e35805c6723d7a2a85d7e3768497f8.zip |
Error out on parser failure
-rw-r--r-- | input.lisp | 11 | ||||
-rw-r--r-- | main.lisp | 6 | ||||
-rw-r--r-- | package.lisp | 1 |
3 files changed, 17 insertions, 1 deletions
@@ -18,3 +18,14 @@ (defun cursor-distance (input1 input2) (- (input-cursor input1) (input-cursor input2))) + +(defun line-and-column (input) + (let ((line 1) (column 1)) + (dotimes (i (input-cursor input)) + (let ((c (char (input-data input) i))) + (case c + (#\Newline + (incf line) + (setf column 1)) + (t (incf column))))) + (values line column))) @@ -8,4 +8,8 @@ (if (parsing-p result) (let ((finished? (not (has-data? (parsing-left result))))) (values (parsing-tree result) finished?)) - result))) + (error (format nil "~a" result))))) + +(defmethod print-object ((obj failure) stream) + (multiple-value-bind (line column) (line-and-column (failure-place obj)) + (format stream "~a:~a: ~a" line column (failure-message obj)))) diff --git a/package.lisp b/package.lisp index c59f997..62846f2 100644 --- a/package.lisp +++ b/package.lisp @@ -5,6 +5,7 @@ #:failure-message #:input-cursor #:input-data + #:line-and-column #:comp #:one-of #:unit |