X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/634c11b088818386ab98ad2282d56d20195cc2de..002d481f71272b0605ac310f3cea595780dae531:/src/module-parse.lisp diff --git a/src/module-parse.lisp b/src/module-parse.lisp index aa7e9f4..63d75cd 100644 --- a/src/module-parse.lisp +++ b/src/module-parse.lisp @@ -245,18 +245,32 @@ (car declarator) pset init scanner)) #\,)) - #\;))))) + (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")))) @@ -267,7 +281,7 @@ ;; Parse a declarator or dotted-declarator, i.e., one whose ;; centre is ;; - ;; maybe-dotted-identifier ::= [id `.'] id + ;; maybe-dotted-name ::= [id `.'] id ;; ;; A plain identifier is returned as a string, as usual; a ;; dotted identifier is returned as a cons cell of the two @@ -303,8 +317,10 @@ (parse (seq ((body (or (seq ("extern" #\;) nil) (parse-delimited-fragment scanner #\{ #\})))) - (make-sod-method class sub-nick name type - body sub-pset scanner)))) + (restart-case + (make-sod-method class sub-nick name type + body sub-pset scanner) + (continue () :report "Continue"))))) (parse-initializer () ;; initializer ::= `=' c-fragment @@ -320,24 +336,27 @@ ;; [`,' list[init-declarator]] `;' ;; ;; init-declarator ::= declarator [initializer] - (parse (and (seq ((init (? (parse-initializer)))) - (make-sod-slot class name type - sub-pset scanner) - (when init - (make-sod-instance-initializer - class nick name init sub-pset scanner))) - (skip-many () - (seq (#\, - (ds (parse-declarator scanner - base-type)) - (init (? (parse-initializer)))) - (make-sod-slot class (cdr ds) (car ds) - sub-pset scanner) - (when init - (make-sod-instance-initializer - class nick (cdr ds) init - sub-pset scanner)))) - #\;))) + (flet ((make-it (name type init) + (restart-case + (progn + (make-sod-slot class name type + sub-pset scanner) + (when init + (make-sod-instance-initializer class + nick name + init + sub-pset + scanner))) + (continue () :report "Continue")))) + (parse (and (seq ((init (? (parse-initializer)))) + (make-it name type init)) + (skip-many () + (seq (#\, + (ds (parse-declarator scanner + base-type)) + (init (? (parse-initializer)))) + (make-it (cdr ds) (car ds) init))) + #\;)))) (parse-initializer-item (sub-pset must-init-p constructor) ;; initializer-item ::= @@ -349,9 +368,11 @@ (parse (and (skip-many () (seq ((name-a :id) #\. (name-b :id) (init (funcall parse-init))) - (funcall constructor class - name-a name-b init - sub-pset scanner)) + (restart-case + (funcall constructor class + name-a name-b init + sub-pset scanner) + (continue () :report "Continue"))) #\,) #\;)))) @@ -419,11 +440,12 @@ ;; `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)))))))))))