From: Mark Wooding Date: Sun, 26 Mar 2017 14:16:18 +0000 (+0100) Subject: src/module-parse.lisp: Improve error recovery for `class' item framing. X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/commitdiff_plain/6362119ed7d736a6617f59f46ec98b6351cb9867 src/module-parse.lisp: Improve error recovery for `class' item framing. Cope with a failure to parse the class name (by inventing a synthetic name) and/or superclass list (by forcing the use of `SodObject' as a parent). --- diff --git a/src/module-parse.lisp b/src/module-parse.lisp index 2d81de1..e175a5b 100644 --- a/src/module-parse.lisp +++ b/src/module-parse.lisp @@ -247,16 +247,30 @@ (define-pluggable-parser class-item initargs (scanner class pset) #\,)) (nil (must #\;))))))) +(defun synthetic-name () + "Return an obviously bogus synthetic not-identifier." + (let ((ix *temporary-index*)) + (incf *temporary-index*) + (make-instance 'temporary-variable :tag (format nil "%%#~A" ix)))) + (defun parse-class-body (scanner pset name supers) ;; class-body ::= `{' class-item* `}' ;; ;; class-item ::= property-set raw-class-item (with-parser-context (token-scanner-context :scanner scanner) - (make-class-type name) - (let* ((duff nil) - (class (make-sod-class name + (when name (make-class-type name)) + (let* ((duff (null name)) + (synthetic-name (or name + (let ((var (synthetic-name))) + (unless pset + (setf pset (make-property-set))) + (unless (pset-get pset "nick") + (add-property pset "nick" var :type :id)) + var))) + (class (make-sod-class synthetic-name (restart-case - (mapcar #'find-sod-class supers) + (mapcar #'find-sod-class + (or supers (list "SodObject"))) (continue () (setf duff t) (list (find-sod-class "SodObject")))) @@ -419,11 +433,12 @@ (define-pluggable-parser module class (scanner pset) ;; `class' id `;' (with-parser-context (token-scanner-context :scanner scanner) (parse (seq ("class" - (name :id) + (name (must :id)) (nil (or (seq (#\;) - (make-class-type name)) - (seq ((supers (seq (#\: (ids (list () :id #\,))) - ids)) + (when name (make-class-type name))) + (seq ((supers (must (seq (#\: + (ids (list () :id #\,))) + ids))) (nil (parse-class-body scanner pset name supers)))))))))))