X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/blobdiff_plain/6362119ed7d736a6617f59f46ec98b6351cb9867..abfdb01c8df52efd0ee4a4a98519d9aebd1956d9:/src/module-parse.lisp diff --git a/src/module-parse.lisp b/src/module-parse.lisp index e175a5b..3f6c224 100644 --- a/src/module-parse.lisp +++ b/src/module-parse.lisp @@ -281,7 +281,7 @@ (defun parse-class-body (scanner pset name supers) ;; 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 @@ -317,15 +317,17 @@ (defun parse-class-body (scanner pset name supers) (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 ;; ;; Return a VALUE, ready for passing to a `sod-initializer' ;; constructor. - (parse-delimited-fragment scanner #\= (list #\, #\;) + (parse-delimited-fragment scanner #\= '(#\, #\;) :keep-end t)) (parse-slot-item (sub-pset base-type type name) @@ -334,24 +336,27 @@ (defun parse-class-body (scanner pset name supers) ;; [`,' 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 ::= @@ -363,9 +368,11 @@ (defun parse-class-body (scanner pset name supers) (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"))) #\,) #\;))))