diff options
| -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 | 
