X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/e0808c472145fc81e52898bc9ac289e10c4f4f41..ad1316527a6aa066d0abc0ada46a3616f5cb451f:/src/lexer-impl.lisp diff --git a/src/lexer-impl.lisp b/src/lexer-impl.lisp index ffc8446..821849b 100644 --- a/src/lexer-impl.lisp +++ b/src/lexer-impl.lisp @@ -44,7 +44,7 @@ Usable in `format''s ~/.../ command." (declare (ignore colonp atsignp)) - (cond ((null char) (write-string "" stream)) + (cond ((null char) (write-string "" stream)) ((and (graphic-char-p char) (char/= char #\space)) (format stream "`~C'" char)) (t (format stream "<~(~:C~)>" char)))) @@ -59,17 +59,21 @@ (return (values token-types nil consumedp))) (scanner-step scanner))) -(defun parse-error-recover (scanner parser recover) +(defun parse-error-recover (scanner parser recover &key ignore-unconsumed) "This is the implementation of the `error' parser." (multiple-value-bind (result win consumedp) (funcall parser) - (cond ((or win (and (not consumedp) (scanner-at-eof-p scanner))) - ;; If we succeeded then there's nothing for us to do here. On the - ;; other hand, if we failed, didn't consume any tokens, and we're - ;; at end-of-file, then there's not much hope of making onward - ;; progress, so in this case we propagate the failure rather than - ;; trying to recover. And we assume that the continuation will - ;; somehow arrange to report the problem, and avoid inundating the - ;; user with error reports. + (cond ((or win + (and (not consumedp) + (or ignore-unconsumed + (scanner-at-eof-p scanner)))) + ;; If we succeeded, or if we didn't consume any tokens and the + ;; caller's OK with that, then there's nothing for us to do here. + ;; On the other hand, if we failed, didn't consume any tokens, and + ;; we're at end-of-file, then there's not much hope of making + ;; onward progress, so in this case we propagate the failure + ;; rather than trying to recover. And we assume that the + ;; continuation will somehow arrange to report the problem, and + ;; avoid inundating the user with error reports. (values result win consumedp)) (t ;; Now we have to do some kind of sensible error recovery. The @@ -105,7 +109,7 @@ (cond-parse (:consumedp cp :expected exp) ((satisfies whitespace-char-p) (parse :whitespace)) ((scan-comment char-scanner)) - (t (if cp (lexer-error char-scanner exp cp) (return))))) + (t (if cp (lexer-error char-scanner exp) (return))))) ;; Now parse something. (cond-parse (:consumedp cp :expected exp) @@ -164,7 +168,7 @@ ;; must make progress on every call. (t (assert cp) - (lexer-error char-scanner exp cp) + (lexer-error char-scanner exp) (scanner-token scanner))))))) ;;;----- That's all, folks --------------------------------------------------