Author: ehuelsmann Date: Fri Mar 14 17:25:24 2008 New Revision: 20
Modified: branches/1.0.x/parser.lisp Log: Merge -r18 from trunk (better error messages).
Modified: branches/1.0.x/parser.lisp ============================================================================== --- branches/1.0.x/parser.lisp (original) +++ branches/1.0.x/parser.lisp Fri Mar 14 17:25:24 2008 @@ -1,17 +1,24 @@
(cl:in-package #:py-configparser)
+(declaim '(special *line-no* *current-section* *file-name* + *current-input*)) + ;; Errors for the parsing side
-(define-condition parsing-error (configparser-error) ()) +(define-condition parsing-error (configparser-error) + ((line-no :initarg :line-no :initform *line-no* :reader line) + (file :initarg :file :initform *file-name* :reader file) + (section :initarg :section :initform *current-section* :reader section) + (message :initarg :text :reader message)) + (:report (lambda (c stream) + (format stream "~A at line ~A" (message c) (line c))))) (define-condition missing-section-header-error (parsing-error) ())
;; The reader
-(declaim '(special *line-no* *current-section* *file-name* - *current-input*)) (declaim '(inline %read-char %unread-char))
(defun %read-char (stream) @@ -44,7 +51,8 @@ (loop for c = (%read-char s) if (eq c #\Newline) do (return) else unless (is-whitespace c) - do (error 'parsing-error))) ;; empty line expected + do (error 'parsing-error + :text "Non-empty line found where empty expected."))) ;; empty line expected
(defun skip-to-eol (s) (loop for c = (%read-char s) @@ -58,7 +66,9 @@ while (is-whitespace c) finally (setf ch c))) (unless (eq ch expect) - (error 'parsing-error)) ;; character expect expected, but ch found + (error 'parsing-error + :text (format nil "Character ~A expected, but ~A found instead." + expect ch))) ;; character expect expected, but ch found ch))
(defun expect-one-of (s expect-bag &key skip-whitespace) @@ -69,7 +79,10 @@ while (is-whitespace c) finally (setf ch c))) (unless (member ch expect-bag) - (error 'parsing-error)) ;; character ch found, but looking for EXPECT-BAG + ;; character ch found, but looking for EXPECT-BAG + (error 'parsing-error + :text (format nil "Character ~A found, but one of ~A expected." + ch expect-bag))) ch))
(defun make-input-buffer (p) @@ -91,7 +104,9 @@ (expect-char s #[) (loop for c = (%read-char s) if (eq c #\Newline) - do (error 'parsing-error) ;; we can't have newlines in section names! + do (error 'parsing-error + :text "Premature end of line, or end of line in section name.") + ;; we can't have newlines in section names! else if (eq c #]) do (progn (skip-to-eol s) @@ -104,7 +119,8 @@ (eq c #=)) do (let ((option-name (finalize-input p))) (when (= 0 (length option-name)) - (error 'parsing-error)) ;; No option name found + (error 'parsing-error + :text "No option name found.")) ;; No option name found (return option-name)) else if (is-whitespace c) do (unread-char (expect-one-of s '(#: #=) :skip-whitespace t) s) @@ -155,7 +171,8 @@ do (%read-char s) ;; skip over the newline character
else do (if (null *current-section*) - (error 'missing-section-header-error) + (error 'missing-section-header-error + :text (format nil "Missing section header; found ~A instead." c)) (set-option p *current-section* (read-option-name p s)
py-configparser-cvs@common-lisp.net